В последней редакции моего кроссплатформенного приложения C ++ (с использованием Juce) есть, вероятно, тупик или, по-видимому, неограниченный цикл в Windows, но не в Mac, и, к сожалению, в настоящее время у нас нет разработчика Windows, так что мне решать.
Я могу запустить программу под Visual Studio 2010 с проблемами, а затем, когда я нажимаю «потеря жизнеспособности»: -DI использую команду «Разбить все», которая, кажется, приостанавливает все мои потоки.Хорошо и хорошо, и большинство стеков вполне разумно.К сожалению, некоторые из потоков, в том числе два, которые, как я подозреваю, находятся в тупике, не имеют пригодных стеков вызовов.
Я прекрасно понимаю, что «вершин» моих стеков не будет, потому чтоУ меня нет отладочной информации, например, ntdll.dll.Но мне кажется, что я получаю немного от середины стека.
Я включаю один из плохих стеков и один из хороших стеков для вашего прочтения.Вы можете видеть, что хороший стек прослеживается вплоть до вызывающей функции потока, но у плохого стека есть только один действительный кадр.
Этот кадр является допустимым, но я не знаю, почемуЯ не могу видеть другие кадры, и это делает мою работу очень трудной.
Любые идеи будут оценены - надеюсь, ваш день был более продуктивным, чем мой!: -D
РЕДАКТИРОВАТЬ: Извините, подумал, что я был очень ясно выше, когда я указал, что я знал, что символы Microsoft отсутствовали, но все равно.Проблема в том, что в трассировке стека отсутствуют все кадры в моем коде , где я уверен, что у меня есть символы отладки.
Я фактически преодолел тупик, так что это не проблемапрямо сейчас, но это делает эффект еще более загадочным, так как теперь я знаю, что я, например, как-то не испортил стек вызовов.
Теперь у меня есть еще немного информации для «следующего парня» -Дело в том, что я вызывал функцию из окна верхнего уровня из потока, а не из потока Windows.(Это кроссплатформенное приложение, и на Mac его не волнует, из какого потока вы их вызываете.) Именно это и стало причиной «тупика» (на самом деле, я не думаю, что это был действительно тупик, но некоторые другие «потери жизнеспособности»), и мне интересно, не из-за этой ли проблемы Visual Studio 2010 отказалась правильно отображать стек.
- плохой стек -
ntdll.dll!7c90e514()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
user32.dll!7e4299ff()
SlowGold 8 (отладочная сборка) .exe! Juce :: Win32ComponentPeer :: setPosition (int x, int y) Строка 513 C ++ SlowGold 8 (отладочная сборка) .exe! 008005f9 ()
РЕДАКТИРОВАТЬ: Да, я видел тот факт, что "ntdll.dll не было загружено никаких символов", но это не проблема: проблема в том, что в ОДНОМ кадрестек.В следующем стеке приведен пример «хорошего стека» из другого потока в той же программе.
- хороший стек -
ntdll.dll!7c90e514()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c90df5a()
kernel32.dll!7c8025db()
kernel32.dll!7c802542()
SlowGold 8 (debug build).exe!juce::WaitableEvent::wait(const int timeOutMillisecs) Line 103 + 0x10 bytes C++
SlowGold 8 (debug build).exe!juce::Thread::wait(const int timeOutMilliseconds) Line 304 C++
SlowGold 8 (debug build).exe!rec::util::thread::Looper<int (__cdecl*)(rec::slow::Instance *),rec::slow::Instance *>::run() Line 24 C++
SlowGold 8 (debug build).exe!juce::Thread::threadEntryPoint() Line 145 C++
SlowGold 8 (debug build).exe!juce::juce_threadEntryPoint(void * userData) Line 156 C++
SlowGold 8 (debug build).exe!juce::threadEntryProc(void * userData) Line 126 + 0x9 bytes C++
SlowGold 8 (debug build).exe!_callthreadstartex() Line 314 + 0xf bytes C
SlowGold 8 (debug build).exe!_threadstartex(void * ptd) Line 297 C
kernel32.dll! 7c80b729 ()
РЕДАКТИРОВАТЬ: вы можете видеть здесь, что, хотя у меня нет полного стека, у меня есть много кадров из моего собственногокод - вы можете видеть, куда мы входим в начало потока и куда мы обращаемся к DLL-библиотекам Microsoft.