GDB是一个非常强大的调试工具,尤其是在查找segmentation fault原因时非常有用.但有时加载了core dump文件后,你会发现出错的地方函数显示是问号.怎么办呢?其实是共享库路径没设置对的原因.
首先启动gdb.
#查看共享库信息
(gdb) info sharedlibrary
From To Syms Read Shared Object Library
No /lib/libpthread.so.0
No /lib/libgcc_s.so.1
No /lib/libc.so.6
No /lib/ld-linux.so.3
#发现共享库的路径都是绝对路径,所以要设置库的根路径.
(gdb) set sysroot /work/xxx/xxx/
#载入要调试的二进制文件
(gdb) file xxx
#载入core dump文件
(gdb) core-file core
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x402084b4 in strlen () from /work/nfs_root/rootfs_NodeTest1.1/lib/libc.so.6
这样就找到了出现段错误的地方了,原来是调用strlen出错了,后面再根据哪里调用strlen找具体出错的地方.
这里遇到了一个坑,就是set sysroot
,,之前用set solib-search-path
和set solib-absolute-prefix
,出错的地方都是显示问号,换成set sysroot
就可以了,应该还是共享库的路径问题,有空再仔细深纠下.