----------------------------------------
用gdb 调试,跟踪glibc库文件
----------------------------------------
这里以调试跟踪glibc 文件为例, 跟踪printf, 没有想象的那么激动。
1. 下载连接库分离的debug 信息
a. vim /etc/yum.repo.d/CentOS-Debuginfo.repo
将enable=0 改为1.
b.
yum search glibc 查看一下。
yum install glibc-debuginfo.x86_64
c. 确认一下。debug 安装在/usr/lib/debug 目录下。
2. 编写一个hello world 文件,用gdb 调试
gdb test
set verbose on
b main
run
看到如下信息:
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from system-supplied DSO at 0x7ffff7ffe000...(no debugging symbols found)...done.
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
看来没有找到 glibc 的 debuginfo
(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/usr/local/lib/debug".
(gdb) set debug-file-directory /usr/lib/debug
(gdb) r 有一个再次加载确认
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from system-supplied DSO at 0x7ffff7ffe000...(no debugging symbols found)...done.
Reading symbols from /lib64/libc.so.6...Reading symbols from /usr/lib/debug/lib64/libc-2.12.so.debug...done.
done.
Loaded symbols for /lib64/libc.so.6
符号已经加载成功
Breakpoint 1, Reading in symbols for libc-start.c...done.
main (argc=1, argv=0x7fffffffe2b8) at test.c:7
7 printf("hello world!\n");
单步跟人printf
(gdb) s
Reading in symbols for ../sysdeps/x86_64/dl-trampoline.S...done.
Reading in symbols for ../sysdeps/x86_64/dl-runtime.c...done.
Reading in symbols for ioputs.c...done.
_IO_puts (str=0x4005e8 "hello world!") at ioputs.c:35
35 {
(gdb) n
37 _IO_size_t len = strlen (str);
(gdb) n
Reading in symbols for ../sysdeps/x86_64/multiarch/strlen.S...done.
38 _IO_acquire_lock (_IO_stdout);
(gdb) n
37 _IO_size_t len = strlen (str);
(gdb) n
38 _IO_acquire_lock (_IO_stdout);
(gdb) n
41 || _IO_fwide (_IO_stdout, -1) == -1)
(gdb) n
43 && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
(gdb) n
Reading in symbols for fileops.c...done.
40 if ((_IO_vtable_offset (_IO_stdout) != 0
(gdb) n
43 && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
(gdb) n
40 if ((_IO_vtable_offset (_IO_stdout) != 0
(gdb) n
43 && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
(gdb) n
40 if ((_IO_vtable_offset (_IO_stdout) != 0
(gdb) n
43 && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
(gdb) n
Reading in symbols for genops.c...done.
hello world!
40 if ((_IO_vtable_offset (_IO_stdout) != 0
看到了加载的源文件符号。 也知道hello world 在哪里打印的。
ctrl-x ctrl-a 可以把gdb 启动到tui 模式。
对于一些常用的选项,可以将它们设置到~/.gdbinit 文件中。
用gdb 调试,跟踪glibc库文件
----------------------------------------
这里以调试跟踪glibc 文件为例, 跟踪printf, 没有想象的那么激动。
1. 下载连接库分离的debug 信息
a. vim /etc/yum.repo.d/CentOS-Debuginfo.repo
将enable=0 改为1.
b.
yum search glibc 查看一下。
yum install glibc-debuginfo.x86_64
c. 确认一下。debug 安装在/usr/lib/debug 目录下。
2. 编写一个hello world 文件,用gdb 调试
gdb test
set verbose on
b main
run
看到如下信息:
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from system-supplied DSO at 0x7ffff7ffe000...(no debugging symbols found)...done.
Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib64/libc.so.6
看来没有找到 glibc 的 debuginfo
(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/usr/local/lib/debug".
(gdb) set debug-file-directory /usr/lib/debug
(gdb) r 有一个再次加载确认
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from system-supplied DSO at 0x7ffff7ffe000...(no debugging symbols found)...done.
Reading symbols from /lib64/libc.so.6...Reading symbols from /usr/lib/debug/lib64/libc-2.12.so.debug...done.
done.
Loaded symbols for /lib64/libc.so.6
符号已经加载成功
Breakpoint 1, Reading in symbols for libc-start.c...done.
main (argc=1, argv=0x7fffffffe2b8) at test.c:7
7 printf("hello world!\n");
单步跟人printf
(gdb) s
Reading in symbols for ../sysdeps/x86_64/dl-trampoline.S...done.
Reading in symbols for ../sysdeps/x86_64/dl-runtime.c...done.
Reading in symbols for ioputs.c...done.
_IO_puts (str=0x4005e8 "hello world!") at ioputs.c:35
35 {
(gdb) n
37 _IO_size_t len = strlen (str);
(gdb) n
Reading in symbols for ../sysdeps/x86_64/multiarch/strlen.S...done.
38 _IO_acquire_lock (_IO_stdout);
(gdb) n
37 _IO_size_t len = strlen (str);
(gdb) n
38 _IO_acquire_lock (_IO_stdout);
(gdb) n
41 || _IO_fwide (_IO_stdout, -1) == -1)
(gdb) n
43 && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
(gdb) n
Reading in symbols for fileops.c...done.
40 if ((_IO_vtable_offset (_IO_stdout) != 0
(gdb) n
43 && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
(gdb) n
40 if ((_IO_vtable_offset (_IO_stdout) != 0
(gdb) n
43 && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
(gdb) n
40 if ((_IO_vtable_offset (_IO_stdout) != 0
(gdb) n
43 && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
(gdb) n
Reading in symbols for genops.c...done.
hello world!
40 if ((_IO_vtable_offset (_IO_stdout) != 0
看到了加载的源文件符号。 也知道hello world 在哪里打印的。
ctrl-x ctrl-a 可以把gdb 启动到tui 模式。
对于一些常用的选项,可以将它们设置到~/.gdbinit 文件中。