在 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 将列出当前堆栈。顶部的元素 #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' 命令显示函数名称和当前行位置,并将 list 的当前行设置为当前可执行行。
set listsize 17
frame
list
列出当前行周围的 8 行。