В GDB: во время запуска программа вышла с кодом 1. Отлично работает вне GDB - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть программа, скомпилированная с флагами отладки, которая прекрасно работает, когда я выполняю ее нормально, но не запускается в 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 сообщает об этой проблеме, даже не пытаясь запустить мою программу? Или это действительно начало, и все мои попытки сломаться по какой-то причине не работают?

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Ну, это не совсем ответ, но он "исправлен".

Решением было попытаться продемонстрировать проблему коллеге. Как мы все знаем, закон Мерфи усиливается во время демонстраций, поэтому я не смог воспроизвести ошибку, как только кто-то посмотрел мне через плечо.

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

Спасибо за вашу помощь всем.

0 голосов
/ 14 ноября 2018

Возможно, вы захотите просмотреть https://sourceware.org/gdb/onlinedocs/gdb/Starting.html, чтобы узнать подробности процесса запуска в gdb. Это может включать в себя оболочку или какой-либо процесс оболочки, и сообщение об ошибке, которое вы цитируете, указывает на выход этой оболочки / оболочки перед тем, как он выполнит ваш настоящий двоичный файл. Например, если вы используете sudo для запуска gdb под системной учетной записью, для которой установлена ​​оболочка /bin/false и , вы передаете ей аргументы и , а не set startup-with-shell off , gdb попытается использовать /bin/false для передачи аргументов в двоичный файл, что, естественно, приведет к сбою, и вы получите точное сообщение, которое вы цитировали, вместо выполнения вашей программы.

0 голосов
/ 28 апреля 2018

Я полагаю, что часть "во время запуска" означает, что программа завершает работу перед вызовом main

Вы должны быть в Windows (стоит упомянуть, потому что решения будут сильно отличаться от, например, Linux).

Нет: это означает, что программа получила EXIT_PROCESS_DEBUG_EVENT до завершения инициализации. Обычно это означает, что kernel32.dll что-то не понравилось в настройке этого процесса, и даже не выполнялась одиночная инструкция вашей программы.

Вы можете получить дополнительную помощь по отладке из GDB с помощью set debugevents 1.

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