我正在尝试开发一个简单的基于文本的用户界面,它运行一些 gdb 命令。 我希望用户能够在代码的某个区域设置和中断/跟踪点并运行一些调试命令。
我想让用户输入需要调试的功能。然后,我获取该函数名称并打印出该函数的源代码,然后要求用户选择在哪一行代码中设置断点/跟踪点。目前,使用反汇编命令我可以为用户打印出内存地址,但我想打印实际的源代码。
这可以在gdb中完成吗?
目前:
Dump of assembler code for function test_function:
0x03800f70 <test_function+0>: push %ebp
0x03800f71 <test_function+1>: mov %esp,%ebp
0x03800f73 <test_function+3>: sub $0x48,%esp
我想要什么:
void main()
{
printf("Hello World\n");
}
谢谢!
编辑: 我明白了:
(gdb) list myFunction
941 directory/directory_etc/sourcefile.c: No such file or directory.
in directory/directory_etc/sourcefile.c
然后我尝试指定 linenum:
(gdb) list directory/directory_etc/sourcefile.c:941
936 in directory/directory_etc/sourcefile.c
所以行为与您所描述的类似,但“list filename:linenum”仍然不起作用
谢谢!
用途:
(gdb) list FUNCTION
详情请参见
list
命令的在线帮助:
(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.
对于任何非玩具项目,您可能会遇到这样的情况:
$ gdb /bin/true
<...>
(gdb) start
<...>
(gdb) list printf
file: "/usr/include/bits/stdio2.h", line number: 104
file: "printf.c", line number: 29
其中列出了代码库中函数的多个定义。在上面的
printf()
例子中,非重载的纯C函数有两个定义。定义于 stdio2.h
中。然后,您可以使用 list FILE:LINENUM
表单指定要列出的内容:
(gdb) list printf.c:29
24
25 /* Write formatted output to stdout from the format string FORMAT. */
26 /* VARARGS1 */
27 int
28 __printf (const char *format, ...)
29 {
30 va_list arg;
31 int done;
32
33 va_start (arg, format);
对于您看到的“sourcefile.c:没有这样的文件或目录”错误,您需要告诉 GDB 在哪里查找源代码。请参阅GDB 手册:源路径。显然,您需要实际拥有要在计算机上列出的功能的源代码。
对于海湾合作委员会:
在源代码编译中添加调试选项标志 -g:
gcc -g test.c
要测试,请使用:
gdb ./a.out
(gdb) list
要了解更多功能,请查看手册页:
man gcc
man gdb
使用
gdb
打开和编辑文件的另一种方法是运行外部命令。为此:
在
gdb
提示符内,键入以下命令以打开 vim
中的文件:
(gdb) !vim <file>
进入
vim
后,通过键入以下内容启用行号:
:set number
要返回到
gdb
提示符,请输入以下命令退出 vim
:
:q!
这会将您带回到
gdb
您离开的地方。