Отладка сбоя на этапе сборки релиза: каковы возможные способы получения стека вызовов? - PullRequest
1 голос
/ 22 ноября 2011

У меня есть родное приложение C ++, которое отлично работает в офисе (мы, конечно, проводим тестирование), но клиенты сталкиваются с множеством различных сбоев. Я знаю, что можно запустить windbg (это кроссплатформенное приложение - Win, Linux и Mac, но сбои происходят на всех платформах, поэтому отладка любой из них полезна), но манипулирование машиной клиента (например, установка и регистрация windbg) вариант. Интересно, есть ли другие способы получить стек вызовов? Существуют ли какие-либо инструменты, которые могут дать двоичным файлам такую ​​информацию?

P. S. Я могу отправлять файлы .pdb вместе с двоичными файлами, я думаю, но я бы предпочел не делать этого.

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

В Windows вы можете настроить Dr.Watson на клиентском компьютере, чтобы в случае сбоя вашего приложения оно создавало так называемый «файл мини-дамп», который затем может быть открыт отладчиком с соответствующий PDB.

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

Edit:

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

Чтобы захватить и сбросить стек вызовов, вы должны сбросить его до разматывания стека. Как это:

int HandleMyException(EXCEPTION_POINTERS* pExc)
{
    // dump it
    MiniDumpWrite(...);

    // Unless you decide to terminate your process, return EXCEPTION_EXECUTE_HANDLER, so that the execution
    // continues normally after the __except block.
    return EXCEPTION_EXECUTE_HANDLER;
}

__try
{
    // Do something...
}
__except (/* stack still not unwound */ HandleMyException(GetExceptionInformation()))
{
    // unwind already took place here, nothing to dump
}
3 голосов
/ 22 ноября 2011

Для Windows вы можете использовать структурированную обработку исключений . API Windows позволяет генерировать трассировку стека при сбое программы. Файл dmp будет создан. Вы можете извлечь этот файл и выполнить отладку в своей среде отладки. Нет необходимости отправлять отладочные файлы или pdb файлы.

Для кроссплатформенности вы можете использовать Google Breakpad . Инструмент генерирует трассировки и может отправлять их автоматически или с последующим созданным пользователем отчетом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...