Gdb-друк у файл замість stdout


104

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

Відповіді:


151

Потрібно включити ведення журналу.

(gdb) set logging on

Ви можете сказати, який файл використовувати.

(gdb) set logging file my_god_object.log

Ви можете вивчити поточну конфігурацію журналу.

(gdb) show logging

15
І якщо ви хочете, щоб вихід переходив лише до файлу журналу, використовуйте set logging redirect on.
Бен С

5
Чи не повинні ми ставити set logging file my_god_object.logраніше set logging on?
Вільний інженер з герпесу

Цей плюс tail -fі awkсьогодні був дуже корисним. Дякую!
рецикли

12

Я виявив, що ви можете перенаправити вихід з gdb у файл за допомогою runкоманди:

(gdb) run > outfile

11
Це був би вихід з налагодженої програми, а не вихід із самого gdb. OP хотів записати власний вихід gdb.
Павло


@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

У деяких системах вам потрібно набратиgdb -c core.3599 ...
user7610

1
> gdb core.3599 -ex 'thread застосовувати всі bt full' -ex вийти Додати --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 без цитування.
Вільний герпес

5

Простий метод для реєстрації gdb у файл, зберігаючи результат (що полегшує написання команд) tee:

gdb command |& tee gdb.log

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.