1、gdb 调试-源代码关联html
在调试程序的过程当中,能够自由地查看相关的源代码(若是有源代码的话)是一项最基本的特性。gdb 固然也提供了这项特性,虽然不如IDE直观,但在必定程度上要比IDE更加灵活和快捷。
gdb之因此可以知道对应的源代码,是由于调试版的可执行程序中记录了源代码的位置;由于源代码的位置在编译以后可能会移动到其它地方,因此gdb还会在当前目录中查找源代码,另外gdb也容许明确指定源代码的搜索位置。
在一个调试会话中,gdb维护了一个源代码查找目录列表,默认值是编译目录和当前工做目录。当gdb须要一个源文件的时候,它依次在这些目录中查找,直到找到一个或者抛出错误。
gdb还维护了一个路径替换规则,将要搜索的原始路径按照找到的第一个规则作前缀替换,而后再在源码搜索目录中查找文件。linux
所以,源代码关联默认状况下搜索路径以下:sass
除了默认搜索路径,还能够经过以下方式来设置源代码搜索位置和替换规则 函数
2. gdb容许设置路径替换规则,以应付源代码位置迁移的状况。spa
当gdb没法显示so动态库的信息或者显示信息有误时,一般是因为库搜索路径错误致使的,可以使用set sysroot、set solib-absolute-prefix、set solib-search-path来指定库搜索路径。.net
1. set sysroot 与 set solib-absolute-prefix 是同一条命令,实际上,set sysroot是set solib-absolute-prefix 的别名。调试
2. set solib-search-path设置动态库的搜索路径,该命令可设置多个搜索路径,路径之间使用“:”隔开(在linux中为冒号,DOS和Win32中为分号)。code
3. set solib-absolute-prefix 与 set solib-search-path 的区别:htm
整体上来讲solib-absolute-prefix设置库的绝对路径前缀,只对绝对路径有效;而solib-search-path设置库的搜索路径,对绝对路径和相对路径均起做用。blog
(编译器自动连接的so库多采用绝对路径)。
在载入动态库信息时Coredump会碰到两种路径:绝对路径和相对路径。编译时连接的库一般是绝对路径,例如"/lib/libc.so.6"、"/lib/libdl.so.2"等,
此时在Coredump文件中也一样保存为绝对路径;而程序用dlopen函数载入的so库可能使用相对路径,例如"./libddd.so",此时Coredump文件原封不动地保存相同的路径。
为便于表述,用A表示set solib-absolute-prefix设置的路径,R(A)表示A去掉根前缀后的路径(即去掉前缀“/”符号),用Bn表示set solib-search-path设置的每一条路径,
用X表示Coredump中保存的库路径,即待搜索的库文件路径,F(X)表示X中去掉目录后的文件名(路径最后“/”符号后的字符串)。
1) A / X ; 先添加solib-absolute-prefix前缀进行搜索,成功则再也不继续,不然继续2)
2) R(A) / X ; 再把1)的根前缀去掉后进行搜索,成功则再也不继续,不然继续3)
3) Bn / R(A) / X ; 再在2)的基础上逐一添加solib-search-path中的每条路径进行搜索,成功则再也不继续,不然继续4)
4) Bn / F(X) ; 再只使用2)中的文件名(去掉目录段),并逐一添加solib-search-path中的每条路径进行搜索,成功则再也不继续,不然继续5)
5) $PATH / R(A) / X ; 在2)的基础上使用环境变量$PATH中的每条路径进行搜索,成功则再也不继续,不然继续6)
6) $LD_LIBRARY_PATH / R(A) / X ;在2)的基础上使用环境变量$LD_LIBRARY_PATH中的每条路径进行搜索,成功则再也不继续,不然继续7)
7) 返回失败
1) X ; 直接使用原始路径进行搜索,成功则再也不继续,不然继续2)
2) Bn / X ; 再逐一添加solib-search-path中的每条路径进行搜索,成功则再也不继续,不然继续3)
3) Bn / F(X) ; 再只使用文件名(去掉目录段),并逐一添加solib-search-path中的每条路径进行搜索,成功则再也不继续,不然继续4)
4) $PATH / X ; 再使用环境变量$PATH中的每条路径进行搜索,成功则再也不继续,不然继续5)
5) $LD_LIBRARY_PATH / X ; 再使用环境变量$LD_LIBRARY_PATH中的每条路径进行搜索,成功则再也不继续,不然继续6)
6) 返回失败
GDB动态库搜索路径: http://blog.csdn.net/_xiao/article/details/23289971
在一些必要的时候,咱们须要查看汇编代码来诊断问题。gdb 提供了这种可能。
gdb提供了两种能力:
2. disassemble,disassemble /m [/m表示混合输出源代码和汇编代码],disassemble /r [/r表示混合输出二进制和汇编代码]
显示指定地址范围内的汇编代码,有4种使用形式: [参数能够是16进制的地址,也能够是函数名]
set disassembly-flavor instruction-set:设置显示汇编代码时使用的风格,目前只针对intel x86系列,可取的值为att和intel,默认是att。
show disassembly-flavor:显示disassembly-flavor设置
set disassemble-next-line on|off|auto:当程序中止下来的时候,是否显示下一行源代码的汇编代码,默认为off。
show disassemble-next-line:显示disassemble-next-line设置。
默认状况时,gdb和gcc输出的汇编都是AT&T格式的,可是它们都有方式来转换为Intel格式。 gcc -S -masm=intel test.c
gdb则是设置环境变量 set disassembly-flavor intel gas事实上也支持Intel格式,只是用得比较少。
参考:
[1]. 使用GDB进行调试: http://www.cnblogs.com/frydsh/p/3367015.html
[2]. 使用GDB的源代码查看功能: http://www.cnblogs.com/frydsh/p/3388828.html