В GDB команда:
list function
отобразит весь источник для функции.
Есть ли команда, которая будет отображать весь источник функции, в которой вы сейчас находитесь, без необходимости вводить имя функции вручную?
В GDB команда:
list function
отобразит весь источник для функции.
Есть ли команда, которая будет отображать весь источник функции, в которой вы сейчас находитесь, без необходимости вводить имя функции вручную?
(gdb) help list
List specified function or line.
With no argument, lists ten more lines after or around previous listing.
"list -" lists the ten lines before a previous ten-line listing.
One argument specifies a line, and ten lines are listed around that line.
Two arguments with comma between specify starting and ending lines to list.
Lines can be specified in these ways:
LINENUM, to list around that line in current file,
FILE:LINENUM, to list around that line in that file,
FUNCTION, to list around beginning of that function,
FILE:FUNCTION, to distinguish among like-named static functions.
*ADDRESS, to list around the line containing that address.
With two args if one is empty it stands for ten lines away from the other arg.
Интересно, что *ADDRESS
.
В x86/x64 текущий указатель находится в регистре rip
так:
(gdb) list *$pc
0x7ffff7b018a0 is at ../sysdeps/unix/syscall-template.S:82.
77 in ../sysdeps/unix/syscall-template.S
Пример из команды cat
, поскольку у меня нет ничего с информацией об отладке.
Когда вы остановились в типе функции bt для backtrace. Backtrace отобразит текущий стек. Элемент в верхней части, # 0, как правило, является функцией, которую вы заинтересованы, и также указывается исходный файл и номер строки.
Например:
(gdb) bt
#0 myClass::EntityTypeStruct::readAttributes (this=0x7fffd00066e0, buf=0x7fffd0006020 "", len=48)
at /team/project/src/EntityTypeStruct.cc:55
#1 0x000000000044ca86 in workerThread (ts=0x7fffea71dcc0)
at /team/project/src/threads/workerThread.cc:219
#2 0x00007ffff775e9d1 in start_thread () from /lib64/libpthread.so.0
#3 0x00007ffff6c07b5d in clone () from /lib64/libc.so.6
Подробнее см. http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html#SEC42.
Кроме того, когда вы устанавливаете точку останова, вы можете указать команды, которые будут запускаться каждый раз, когда вы нажимаете эту точку останова. См. http://www.chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_6.html#SEC35
Итак, если вы знаете, сколько строк в вашей функции, вы можете установить команду для перечисления всех исходных строк функции:
(gdb) break myClass::EntityTypeStruct::readAttributes
Breakpoint 1 at 0x61ec3b: file /team/project/src/EntityTypeStruct.cc, line 38.
(gdb) commands 1
list 38,104
end
gdbtui может быть полезна для просмотра источника во время отладки.
Команда "frame" показывает имя функции и текущее местоположение строки и устанавливает текущую строку для текущей текущей строки.
set listsize 17
frame
list
перечисляет 8 строк, окружающих текущую строку.