Использование GDB изнутри процесса для получения трассировки стека - PullRequest
1 голос
/ 25 января 2011

В моем коде у меня есть некоторый макрос assert во время выполнения (назовем его runtime_assert).Это должно быть в многопоточном приложении.

Когда переданное условие оценивается как ложное, runtime_assert завершает программу, выгружая трассировку стека с последующим вызовом _exit ().

Как вы, вероятно, знаете, выгрузка трассировки стекане является тривиальной задачей ( Как получить трассировку стека для C ++, используя gcc с информацией о номере строки? ).

Идея состоит в том, чтобы вызвать gdb с pid процесса, вызвав system ().

  1. Это хорошая идея в целом?Или лучше использовать только инструменты процесса, чтобы получить обратную трассировку?(например, gcc
    backtrace () / backtrace_symbols ())
  2. Когда вызывается ptrace (), это как-то повлияет на другие потоки?
  3. Если в системе не хватает ресурсов (например, памяти /места на диске) может ли ошибка gdb fork?
  4. Как распечатать трассировку стека только текущего потока?(Я могу получить адрес текущего метода из gcc backtrace ())

Ответы [ 2 ]

2 голосов
/ 25 января 2011
  1. Не думайте, что это хорошая идея - к тому времени, когда system() закончен, и GDB присоединяет другие потоки, это уже далеко от проблемной точки. На самом деле я даже не думаю, что в этом случае стоит беспокоиться о трассировке стека (это может помочь, когда вы даете свое приложение некоторым «менее изощренным» пользователям и любая информация, которую вы получаете от них, полезна ). Здесь я бы просто abort() и имел бы хороший основной файл для просмотра.
  2. Я не знаю, указано ли это где-либо - моё подозрение, что это зависит от ОС и библиотеки потоков (кто-нибудь, пожалуйста, исправьте меня, если я ошибаюсь).
  3. Да, может произойти сбой (хотя и для основного файла).
  4. Я полагаю, что это можно сделать с помощью некоторого gettid() и файла инициализации GDB и пользовательских хитростей команд, но, опять же, не думаю, что я буду беспокоиться.
0 голосов
/ 11 мая 2011

Я помню похожую дискуссию об этом некоторое время назад на SO. После поиска по форуму я обнаружил, что это вы спросили, и это та же самая тема, на которую вы указываете в этом вопросе.

Ты видел ответ Нобара? Кажется, это именно то, что вы ищете. Хитрость заключается в том, чтобы использовать execlp для вызова GDB вместо system :

Как получить трассировку стека для C ++, используя gcc с информацией о номере строки?

...