我有一个项目使用Java来做GUI和C ++来进行计算,通过JNI连接。我在应用程序中遇到了一个僵局,它在3个多小时后就显现出来了。我以为我会使用WinDBG进行调试。所以我将应用程序作为调试对象附加,加载了正确的符号并开始查看调用堆栈。问题是,我得到的调用堆栈似乎与应用程序正在做的不一致。
例如,我有大约10个工作线程,全部由
打开CreateThread(NULL, 0, &(work), this, 0, NULL);
但是windbg只显示了一个这样的线程。我还有至少两个线程,其相同的调用堆栈如下所示:
wow64cpu!CpupSyscallStub
wow64cpu!Thunk0ArgReloadState
wow64!RunCpuSimulation
wow64!Wow64LdrpInitialize
ntdll!LdrpInitializeProcess
ntdll! ?? ::FNODOBFM::`string'
ntdll!LdrInitializeThunk
那是什么?
然后我有一个线程,其堆栈跟踪由重复的单个函数组成:
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myModule!myFunc
myFunc
函数不是递归的,并且不会启动自己的线程。堆栈有可能是这样的吗?堆栈跟踪的其余部分在哪里?
在javaw模块中没有可以运行的线程(并且应该至少有一个 - EDT)
如何让调试器正确识别线程并使其显示真正的堆栈跟踪?
另外......是否可以以某种方式标记线程,以便在调试器中识别它们?
编辑更多信息:
出于许可目的,我无法使用Visual Studio
WinDBG版本:6.12.0002.633 AMD64
Windows 7,6.1 build 7601,SP1
Java 1.7.0_07
我使用Eclipse CDT并进行优化我只能选择“默认”,“最小化大小”和“最大化速度”。我使用“默认”。我的编译命令如下所示:cl /c /EHs /MD /Zi
当我显示反汇编时,它显示模块中函数的汇编代码,而不是原始源代码。但是,它会从源位置打开源文件。