以下内容总结自debug hacks一书的高手们的调试技术一章
1.strace的使用技巧
strace name,以这样的方式运行程序,可以查看到程序运行时的系统调用,仅仅是系统调用。可以看到系统调用失败时的传参,或者卡在哪个函数位置等等。
-i选项可以看到每个系统调用的地址,那样在使用gdb调试时可以加断点。
-p选项可以attach上已经正在运行的程序
-o可以指定输出文件
-t和-tt可以指定系统调用时间,分别以秒和毫秒为单位。
2.objdump的使用技巧
objdump反汇编之后的文件往往很难看出来对应于c程序中的哪一行代码,这个时候可以指定-S和-l选项分别显示出源文件中的代码和行号,程序需要包含有调试信息,最好是没有优化选项的文件,但不一定完全对应,可以作为参考。
3.valgrind的使用技巧
valgrind可以对缓存,堆进行评测,检测POSIX线程冲突等。
最常用的内存检测,--tool=memcheck这个工具是valgrind的默认工具,可以不指定。
可以检测的内容有,内存泄露,非法内存访问,读取未初始化区域,访问已释放区域,内存双重释放,非法栈操作等等。但是valgrind对于栈上的空间检测不是很好。
4.kprobe的使用
这个属于内核调试技术,可以在不重新编译内核的基础上,在任何一个函数内加打印,或者做其他任何处理,当然需要有内核源码,做一个合适的操作。
比较好的一点是可以显示栈跟踪。这在调试中属于很好的技术。
5.jprobe的使用
与kprobe相同,可以检测任何一个内核函数的使用情况,但是jprobe的优点在于侦测函数的参数和被侦测函数的参数一样,可以很方便的打印出传参,而不像kprobe需要通过堆栈或者寄存器推理。
其实我觉得以上两个工具对应于gdb就是断点。
6.kprobe的强大之处
kproble强大他可以插入内核任意位置,而不像jprobe只能插入在函数的开头处,包括他还在可以插在某条指令执行后还是某条指令执行前。
7.kprobe替换内核函数
kprobe可以替换内核中的某个函数,这样就可以在内核不重新编译的情况下,调试某个函数的情况。
8.KAHO替换应用程序函数
类似于上一个kprobe的功能,这样可以省的再次编译大型的应用程序。
9.systemtap的使用
这个工具是利用kprobe实现的一个工具,但是他是类似于脚本语言的方式来使用的,更加方便。功能有,查看堆栈,内部数据,等等。在应用程序的调试中就是gdb工具。
10./proc/meminfo中的宝藏
这个可以用作内存检测,他与valgrind相比,valgrind必须在程序运行结束时才给出测试结果,但这个可以直接实时看到。
11./proc/<pid>/mem快速读取进程的内容
和gdb或者ptrace一样,是查看内存的功能,但是速度上要快。
12.oom killer
当内存不足时,系统会对每个应用进程进行评分,评分最高者被关闭。
13.错误注入
一般来讲,malloc都会是成功的,但是这样就很难检测一些如果分配失败时导致的错误。那么这个功能就是提高分配失败的概率,或者说指定分配失败。
需要连接一个failmalloc的库。方便测试失败情况。
14.oprofile的使用
这个工具可以查看一个程序的性能,比如l2级缓存的命中,各个函数的运行时间等等,并且这个工具可以生成图表。
最常用的是各个函数的运行时间。
类似的工具还有gprof,但是功能上差很多
另外一个要注意的是,oprofile在虚拟机下不支持按事件计数。比较明显的是各个函数的运行时间检测不支持
15.vprobe
找不到相关资料
16.查看x86机器是否支持64位
这一点可以通过查看cpu自带的寄存器内容或者/proc/cpuinfo中的内容