程序调试

来源:互联网 发布:淘宝店经验 编辑:程序博客网 时间:2024/06/10 07:46

1、查看时候是最新代码编译生成的可执行文件/库,查看是否有自己新加的代码

strings a.out | grep “my add code”  

2、查看库/可执行文件依赖了哪些库

ldd libxxx.a

3、查看编译后的可执行文件中的符号信息,如函数名编译后变成了什么

nm a.out

——binutil工具

4、gdb常用命令记录
这里写图片描述

附1:数据断点(DataBreakpoint)
全局变量的值不是我期望的,而我自己没有做赋值,那肯定就是被修改了,不管是什么原因,最终就是要确定它在什么地方被修改的。由于工程中使用的地方太多,没一处去加代码不现实,太耗费时间了,效率也比较低下。可以试试数据断点的工具。
理解数据断点,应该是对某一变量的地址所对应的空间进行监控,一旦该地址对应的空间被修改,就会立即产生中断,并将程序的运行指针指向修改的语句,由此确定问题所在。

附2:名字粉碎机制
实现代码位于functions_info—>>symtab_symbol_info—>>>search_symbols—>>re_exec (SYMBOL_NATURAL_NAME (*psym)),这里涉及到了C++(以及其他的例如java/objc之类的语言)的名字粉碎机制,他为了指出重载函数,所以将函数的名字进行了编译时粉碎,从而让一个名字看起来尽可能的全局唯一,对应的,gdb就需要完成这个逆向的反粉碎过程,将一个粉碎之后的变量名称再还原为原始的全局唯一,对应的,gdb就需要完成这个逆向的反粉碎过程,将一个粉碎之后的变量名称再还原为原始的源代码中定义的变量名,从而可以达到和程序猿的交互。