我正在调查由于本地代码中发生错误而导致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 窗口中转换了值,该窗口中的变量在调试时显示。但是,由于值低至8900
,因此这种想法不太可能。
我过去也注意到,有时值不会立即刷新,因此当断点触发时,我总是单步执行该函数,但是值始终大于0。
我做错了什么?为什么我的断点触发? VS是否可以正确解析arg0
?
谢谢。
答案 0 :(得分:1)
如果将断点放在代码的第一行,则参数值尚未在VS中初始化(如果您手动进入函数,也会发生这种情况)。将断点放在第二行(在大括号之后的任何地方),它可能会起作用。