我有一个项目使用 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
当我显示反汇编时,它显示模块中函数的汇编代码,而不是原始源代码。但是,它会从源位置打开源文件。