Подтвердить что ты не робот

Gdb - введите источник текущей функции без ввода имени

В GDB команда:

list function

отобразит весь источник для функции.

Есть ли команда, которая будет отображать весь источник функции, в которой вы сейчас находитесь, без необходимости вводить имя функции вручную?

4b9b3361

Ответ 1

(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, поскольку у меня нет ничего с информацией об отладке.

Ответ 2

Когда вы остановились в типе функции 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

Ответ 3

gdbtui может быть полезна для просмотра источника во время отладки.

Ответ 4

Команда "frame" показывает имя функции и текущее местоположение строки и устанавливает текущую строку для текущей текущей строки.

set listsize 17
frame
list

перечисляет 8 строк, окружающих текущую строку.