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

Conditional breakpoint triggers when it should not

我正在调查由于本机代码中发生错误而导致 JVM 崩溃的异常。为此,我将 VS 附加到与我的问题相关的 javaw 进程和调试函数。

我目前看的功能如下:

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

首先我想到了 VS 的溢出错误地转换了 Local window 中的值,其中变量在调试时显示。然而,有些值低至 8900,这使得这个想法不太可能。

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

我做错了什么?为什么我的断点会触发? VS 是否正确解析 arg0

谢谢。

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