Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

Взгляните на StackWalk64.

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

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

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

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

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

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

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

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

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

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

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

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

создайте это:

HKEY_LOCAL_MACHINE\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\ Microsoft\ Windows NT\CurrentVersion\Выполнение файла образа Options\FileName.exe

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top