У меня есть проект, который использует 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 драм64
Windows 7, 6.1 сборка 7601, SP1
Java 1.7.0_07
Я использую Eclipse CDT и для оптимизации могу выбрать только «По умолчанию», «Минимизировать размер» и «Максимизировать скорость». Я использую «По умолчанию». Моя команда компиляции выглядит так: cl /c /EHs /MD /Zi
Когда я отображаю разборку, он показывает код сборки для функций в модуле, а не исходный код. Тем не менее, он открывает исходные файлы из исходного местоположения.
Задача ещё не решена.
Других решений пока нет …