У меня есть программа, скомпилированная с флагами отладки, которая прекрасно работает, когда я выполняю ее нормально, но не запускается в gdb.
Вот краткое изложение того, что я вижу:
gdb --args myProgram various arguments
//some standard gdb output stuff here
run
Starting Program: /full/path/to/my/executable/myProgram various arguments
During startup program exited with code 1
Я полагаю, что часть "во время запуска" означает, что программа завершает работу перед вызовом main, но до сих пор я не смог выяснить, как установить точку останова до ее сбоя.
То, что я пытался
- Я проверил, что путь, который выводит GDB для моего исполняемого файла, правильный
b main
- тот же вывод, что и раньше
b _start
- тот же вывод, что и раньше
b _init
- тот же вывод, что и раньше
b exit
- тот же вывод, что и раньше
catch syscall exit_group
- тот же вывод, что и раньше
starti
- нет такой команды, потому что мой GDB слишком стар
set disable-aslr on
- такого символа нет (на данный момент это было немного отчаянно, я понятия не имею, играет ли вообще роль ASLR в этом)
set stop-on-solib-events 1
- тот же вывод
catch load
- неопределенная команда catch
break *0
- (отличный хак из этот ответ ) тот же вывод, что и раньше (плюс сообщения о неверном адресе)
info file
- чтобы увидеть адрес точки входа, это был тот же адрес, что и _start
b std::terminate
- не удалось найти символ
- Я рассмотрел довольно много других вопросов по обмену стека, но, к сожалению, я не отслеживал их все, поэтому не могу перечислить их все здесь.
То, чего я действительно не хочу пытаться
Единственное, что я знаю о том, что происходит до main, это то, что статически хранимые переменные инициализируются. Поэтому я полагаю, что при подходе, который я мог бы предпринять, было бы попытаться определить все места, где статические переменные инициализированы, и установить точки останова там. Тем не менее, это большая база кода, которая зависит от множества общих библиотек, и многие из них довольно грязные, потому что многие из них были написаны в 80-х годах, когда стандарты кодирования были совсем другими. Я действительно не хочу копаться во всем этом, тем более, что у меня довольно низкий уровень уверенности, что это все равно поможет мне.
Некоторые общие вопросы, которые у меня есть
Возможно, мне даже не следовало бы пытаться установить точку останова, прежде чем программа закроется. Может быть, есть другой способ выяснить (или даже догадаться), что вызывает его выход.
В чем различия между тем, как программа запускается в GDB, и тем, как она обычно запускается из командной строки?
Каковы некоторые распространенные причины появления этой ошибки, когда программа работает нормально вне GDB?
Возможно ли, что GDB сообщает об этой проблеме, даже не пытаясь запустить мою программу? Или это действительно начало, и все мои попытки сломаться по какой-то причине не работают?