Ждать с крахом отладчика?

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

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

Вопрос довольно общий из-за разнообразия платформ, языков и отладчиков. Я спрашиваю о C++ и думаю, что решения для Windows (VS), Linux (gdb), Mac (gdb?) были бы наиболее полезными для сообщества. Меня интересует Linux + gdb.


person Łukasz Lew    schedule 23.09.2009    source источник


Ответы (6)


В Linux (и, возможно, в OSX и других Unixen) вы можете разрешить программам оставлять дамп ядра с помощью утилиты ulimit.

Ниже приведены краткие инструкции.

person gnud    schedule 23.09.2009

В Windows есть DebugBreak()IsDebuggerPresent()), что является одним из вариантов того, что может произойти при отказе assert.

В MacOS есть аналогичные вызовы API (Debugger() или SysBreak()).

Я не очень разбираюсь в Linux, но, насколько я знаю, неудачное утверждение в Linux вызовет дамп памяти, который можно посмотреть в отладчике.

person sbi    schedule 23.09.2009
comment
int 3 — это универсальная инструкция ассемблера для перехода к отладчику, и это то, что названные вами функции вызывают внутри. - person Blindy; 23.09.2009
comment
Если под «универсальным» вы имеете в виду инструкцию x86 для прерывания работы, конечно;) - person Falaina; 23.09.2009

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

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

person Liran Orevi    schedule 23.09.2009
comment
IIRC, одним из значений по умолчанию является дамп ядра. - person Richard Corden; 23.09.2009

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

На любой машине с установленной Visual Studio должно быть Just in Time отладка включена. По существу это означает, что отладчик не должен запускаться, когда процесс сталкивается с фатальным исключением.

Отладка Just in Time включается через раздел реестра. Перейдите по ссылке выше для получения дополнительной информации.

Если вы хотите зафиксировать моментальный снимок процесса для последующего просмотра, то обычно это делается с помощью Adplus.vbs (с участием) или DebugDiag (без участия). Adplus доступен через набор инструментов отладки для Windows, но DebugDiag загружается отдельно.

person Zach Bonham    schedule 23.09.2009

В дополнение к ulimit, предложенному gnud, было бы неплохо использовать отчет о сбоях: http://code.google.com/p/google-breakpad/w/list

person Valentin Heinitz    schedule 23.07.2010

Я реализовал такую ​​функциональность в виде библиотеки LD_PRELOADable в https://github.com/l29ah/waitgdb

По сути, он обрабатывает сигналы, пригодные для отладки, и останавливает процесс, отправляющий их SIGSTOP, чтобы вы могли подключить свой отладчик позже.

person L29Ah    schedule 15.08.2019