代码之家  ›  专栏  ›  技术社区  ›  Koenigsberg

条件断点在不应该触发时触发

  •  0
  • Koenigsberg  · 技术社区  · 7 年前

    我正在调查一个导致JVM崩溃的异常,这是由于本机代码中发生了一个错误。为此,我将VS附加到 爪哇语 处理和调试与我的问题相关的函数。

    JNIEXPORT void JNICALL Java_org_bytedeco_javacpp_BoolPointer_allocateArray(JNIEnv* env, jobject obj, jlong arg0) {
        bool* rptr = new (std::nothrow) bool[arg0];
        jlong rcapacity = arg0;
        JavaCPP_initPointer(env, obj, rptr, rcapacity, rptr, &JavaCPP_org_bytedeco_javacpp_BoolPointer_deallocateArray);
    }
    

    这是JNI生成的代码,用于支持Java和本机代码之间的通信。

    由于我怀疑某个条件会触发未处理的异常,最终导致JVM硬崩溃,因此使用断点来研究上面显示的函数。

    断点是有条件的,并包含以下条件:

    "arg0 < 1" is "True"
    

    它必须在值为一或负值时触发 只有 arg0 值,例如 3178311 .

    本地 8900 这使得这个想法不太可能。

    在过去我也注意到,有时值不会立即刷新,所以我总是在触发断点时逐步遍历函数,但是值始终大于0。

    我做错了什么?为什么断点会触发?VS解决了吗 arg0

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Max Langhof    7 年前

    如果将断点放在代码的第一行,则参数的值尚未在VS中初始化(如果手动进入函数,也会发生这种情况)。把断点放在第二行(在大括号后面的任何地方),它可能会工作。