Стек вызовов во время выполнения - PullRequest
5 голосов
/ 24 сентября 2008

Я хочу получить доступ к стеку вызовов во время выполнения в приложении Native C ++. Я не использую IDE. Как отобразить стек вызовов?

Обновление: у меня есть функция, которая вызывается из многих точек по всему приложению. Вылетает в редких случаях. Я искал способ узнать имя звонящего и записать его в журнал.

Ответы [ 6 ]

3 голосов
/ 24 сентября 2008

Посмотрите на StackWalk64 .

Если вы привыкли делать это в .NET, то вас ждет неприятный сюрприз.

1 голос
/ 21 октября 2008

Если вы хотите получить колл-стэк сбоя, вы действительно хотите сделать посмертную отладку . Если вы хотите проверить стек вызовов приложения во время его работы, это одна из многих функций, которые SysInternals Process Explorer может предложить.

1 голос
/ 02 октября 2008

Вам следует рассмотреть возможность установки фильтра необработанных исключений и записи файла мини-дампа внутри него. Это не так уж сложно, и хорошо документировано . Просто придерживайтесь минимума того, что вы делаете один раз, в своем фильтре необработанных исключений (прочитайте, что может пойти не так , если вы проявите творческий подход).

Но чтобы быть в безопасности (ваш необработанный фильтр исключений может быть случайно перезаписан), вы можете поместить свой код в __try / __ кроме блока и записать мини-дамп из функции фильтра (обратите внимание, что у вас не может быть объектов, которые требуют автоматического разматывание в функции с помощью __try / __ кроме блока, если они у вас есть, рассмотрите возможность помещения их в отдельную функцию):

длинный __stdcall myfilter (EXCEPTION_POINTERS * pexcept_info)
{
mycreateminidump (pexcept_info);
return EXCEPTION_EXECUTE_HANDLER;
}
void myfunc ()
{
__try {
// ваша логика здесь
} __except (myfilter (GetExceptionInformation ())) {
// обработано исключение
}
}

Затем вы можете проверить файл дампа с помощью выбранного вами отладчика. Как Visual Studio, так и отладчики из пакета средств отладки Windows могут обрабатывать мини-дампы.

1 голос
/ 24 сентября 2008

Я считаю, что на этой странице есть ответ, который вы ищете. Вы сказали Visual C, так что я предполагаю, что вы имеете в виду Windows.

0 голосов
/ 02 октября 2008

Вылетает в редких случаях. Я искал способ узнать имя звонящего и записать его в журнал.

Что ты имеешь в виду под этим сбоем? Нарушение доступа? Делить на ноль? что именно? Взаимодействует ли он с компонентами режима ядра?

Включить appverifier. это должно устранить многие вещи.

создать это:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Параметры выполнения файла изображения \ FileName.exe

под этим ключом создайте новую строку имя: отладчик значение: c: \ pathtowindbg \ windbg.exe -gG -xe av

Если вы используете 32-битный код с WOW, вы должны сделать это под узлом wow3264.

0 голосов
/ 24 сентября 2008

Если вы не проводите активную отладку, вы можете «аварийно завершить» приложение, чтобы создать мини-дамп (это можно сделать неинвазивно, и приложение продолжит работу). IIRC DrWatson разрешит вам сделать это, если не пользовательский дамп из службы поддержки MS.

Затем вы можете загрузить дамп в windbg и увидеть там переменные callstack + и т. Д. Вам понадобятся символы вашего приложения, чтобы понять смысл.

Если вы ищете более простые трассировки стиля кода во время выполнения, я рекомендую простой класс, который вы создаете для каждого метода, конструктор записывает имя метода с использованием OutputDebugString. Используйте WinDebug для просмотра трассировки при запуске программы. (установите некоторую форму контроля в своем классе, даже если это просто глобальная переменная или значение реестра или глобальный Atom, чтобы вы могли включить или выключить трассировку по своему желанию).

...