Linux on Power 上的调试工具和技术(5)

调试其他程序问题的工具和技术

除了内存 bug 之外,开发人员通常还会碰到程序虽然能够成功编译,但是在运行时却会产生内核转储或段错误的问题。有时在程序完成之后,程序的输出可能与所期望或设计的不同。在这两种情况中,可能代码中存在您认为正确而实际上错误的情况。接下来的几节中介绍的调试器将帮助您找到这些情况的原因。

GNU 项目调试器

GDB(GNU 项目调试器)可以让您了解程序在执行时“内部” 究竟在干些什么,以及在程序发生崩溃的瞬间正在做什么。

GDB 做以下 4 件主要的事情来帮助您捕获程序中的 bug: 在程序启动之前指定一些可以影响程序行为的变量或条件 在某个指定的地方或条件下暂停程序 在程序停止时检查已经发生了什么 在程序执行过程中修改程序中的变量或条件,这样就可以体验修复一个 bug 的成果,并继续了解其他 bug

要调试的程序可以是使用 C、C++、Pascal、Objective-C 以及其他很多语言编写的。GDB 的二进制文件名是 gdb。

gdb 中有很多命令。使用 help 命令可以列出所有的命令,以及关于如何使用这些命令的介绍。下表给出了最常用的 GDB 命令。


表 1. gdb 中最常用的命令
命令 说明 例子
help   显示命令类别   help - 显示命令类别
help breakpoints - 显示属于 breakpoints 类别的命令
help break - 显示 break 命令的解释
 
run   启动所调试的程序   ?  
kill   终止正在调试的程序的执行   通常这会在要执行的代码行已经超过了您想要调试的代码时使用。执行 kill 会重置断点,并从头再次运行这个程序  
  cont   所调试的程序运行到一个断点、异常或单步之后,继续执行   ?  
info break   显示当前的断点或观察点   ?  
break   在指定的行或函数处设置断点   break 93 if i=8 - 当变量 i 等于 8 时,在第 93 行停止程序执行  
Step   单步执行程序,直到它到达一个不同的源代码行。您可以使用 s 来代表 step 命令   ?  
Next   与 step 命令类似,只是它不会“单步跟踪到”子例程中   ?  
print   打印一个变量或表达式的值   print pointer - 打印变量指针的内容
print *pointer - 打印指针所指向的数据结构的内容
 
delete   删除某些断点或自动显示表达式   delete 1 - 删除断点 1。断点可以通过 info break 来显示  
watch   为一个表达式设置一个观察点。当表达式的值发生变化时,这个观察点就会暂停程序的执行   ?  
where   打印所有堆栈帧的栈信息   where - 不使用参数,输出当前线程的堆栈信息
where all - 输出当前线程组中所有线程的堆栈信息
where threadindex - 输出指定线程的堆栈信息
 
attach   开始查看一个已经运行的进程   attach <process_id> - 附加到进程 process_id 上。process_id 可以使用 ps 命令找到  
info thread   显示当前正在运行的线程   ?  
thread apply threadno command   对一个线程运行 gdb 命令   thread apply 3 where - 对线程 3 运行 where 命令  
Thread threadno   选择一个线程作为当前线程   ?  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27705.html