Gdb печатает в файл вместо стандартного вывода

104

Я запускаю gdb и хочу изучить один из тех неудачных объектов бога. Чтобы увидеть все это, требуется много страниц (а у меня 24-дюймовый монитор повернут на бок!). Для простоты использования я бы хотел, чтобы gdb распечатал объект в файл, а не на экран, чтобы я мог открыть его в vi и перемещаться с легкостью.При всей универсальности gdb должен быть способ сделать это, верно?

питоническая метафора
источник

Ответы:

152

Вам необходимо включить ведение журнала.

(gdb) set logging on

Вы можете указать, какой файл использовать.

(gdb) set logging file my_god_object.log

И вы можете проверить текущую конфигурацию ведения журнала.

(gdb) show logging
Тадеуш А. Кадлубовски
источник
15
И если вы хотите, чтобы вывод шел только в файл журнала, используйте set logging redirect on.
Ben C
5
Разве мы не должны установить set logging file my_god_object.logраньше set logging on?
Herpes Free Engineer
Этот плюс tail -fи awkсегодня действительно помог. Спасибо!
remcycles 05
13

Я обнаружил, что вы можете перенаправить вывод из gdb в файл с помощью runкоманды:

(gdb) run > outfile
Лукас Габриэль Санчес
источник
11
Это был бы вывод отлаживаемой программы, а не вывод от самого gdb. OP хотел записать собственный вывод gdb.
Пол
см. также: stackoverflow.com/questions/2388561/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
@thepaul, но на самом деле это очень полезно, поскольку я отлаживаю программу QT, которая просто уничтожает stdin gdb своим мусором QDebug
rostamn739
@ rostamn739 упс, совсем не помогло
rostamn739
12

Расширение ответа @qubodup

gdb core.3599 -ex bt -ex quit |& tee backtrace.log

-exкоммутатор выполняет команду GDB. Таким образом, приведенное выше загружает основной файл, запускает btкоманду, затем quitкоманду. Вывод записывается backtrace.logна экран, а также на него.

Еще один полезный вызов gdb (дающий трассировку стека с локальными переменными из всех потоков) - это

gdb core.3599 -ex 'thread apply all bt full' -ex quit
user7610
источник
В некоторых системах вам нужно ввестиgdb -c core.3599 ...
user7610
1
> gdb core.3599 -ex 'thread применить все bt full' -ex quit Добавить --batch для запуска без приглашения -eg sudo gdb --batch core.3599 -ex 'thread применить все bt full' -ex quit> output .log
Дэвид Скелли
9

Из https://sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html :

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

set logging on

Включить ведение журнала.

set logging off

Отключить ведение журнала.

set logging file file

Измените имя текущего файла журнала. Файл журнала по умолчанию - gdb.txt.

set logging overwrite [on|off]

По умолчанию GDB добавляется в файл журнала. Установите перезапись, если вы хотите вместо этого настроить вход в систему для перезаписи файла журнала.

set logging redirect [on|off]

По умолчанию вывод GDB будет идти как в терминал, так и в файл журнала. Установите перенаправление, если хотите, чтобы вывод шел только в файл журнала.

show logging

Показать текущие значения параметров ведения журнала.

Хусин Альхадж Ахмаде
источник
2
Скопируйте и вставьте sourceware.org/gdb/onlinedocs/gdb/Logging-Output.html без ссылки.
Herpes Free Engineer
5

Простой способ записать gdb в файл, все еще видя вывод (что упрощает написание команд), заключается в использовании tee:

gdb command |& tee gdb.log
Qubodup
источник
1

Хотя здесь есть много хороших ответов, мне все же нужно опубликовать единственное, что у меня сработало:

[niko@my-laptop]# gdb MyBinary 2>&1 log.txt

Это был единственный способ получить gdb и двоичный вывод в один и тот же файл log.txt, одновременно просматривая его на консоли.

РЕДАКТИРОВАТЬ:

Внимание: Выходные данные, кажется, частично не синхронизируются между выходом GDB и двоичным выходом. Может кто-нибудь подтвердить? Возможно, вы захотите проверить, есть ли у вашего telnet / ssh-клиента функцию для регистрации вывода, который вы видите в своей консоли.

Нико
источник
1

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

(gdb)set height 0

Я нашел его в этой статье: https://askaralikhan.blogspot.com/2016/05/gdb-all-threads-bt-to-file.html?showComment=1584614942454#c4584028195226351332

lexdo
источник