用gdb 调试,跟踪glibc库文件

----------------------------------------
用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 文件中。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值