在继续linux kernel的工作之前,忙里偷闲我们看一下linux下的debug工具。这里主要学习GDB和insight的使用
1. 安装GDB
一般系统中应该都已经安装了gdb,如果没有安装的话
sudo apt-get install gdb
2. 源代码样例
采用的是来自于http://opencsl.openfoundry.org/Lab05_debugger.rst.html的代码
文件test.c
#include<stdio.h> char* encode(char* str){ char* tempStr = str; while( *tempStr != 0 ){ (*tempStr)++; tempStr++; } } int main(int argc, char* argv[]){ int i; for(i = 0; i < argc; i++){ encode(argv[i+1]); printf("%s\n", argv[i+1]); } } 3. 编译 gcc -g -o test test.c
记住参数里面需要加-g,表明gdb的debug
4. 开始调试
gdb ./test
5. 运行
run
可以看到出错的提示信息
6. list命令
list命令主要是列出源代码,可以试试如下命令,看不同的效果
list
list, 5
list encode, 5
7. 断点命令是b
这里列两个断点
b encode
b 10
8. 开始运行
set args abc, osss
run
继续的方式
-
continue ,或是简写 cont、c
continue 的意思是继续执行到下一个中断点或是程式结束为止。
-
next ,或是简写 n
next 是一次执行一行程式码,当程式码是呼叫函式时, GDB 只会把它视为一行程式码。
-
step ,或是简写 s
step 和 next 类似,但当碰到函式呼叫时, GDB 会进入函式中逐行执行。
9. 显示寄存器的值
p args
p str
p encode
只显示头两个字符
p str[0]@2
16进制显示
p/x str[0]@2
10. info命令的使用
info 则是显示各种 GDB 内设定、程式执行状况的指令。目前设定的中断点、 display ,或是 CPU registers 的内容都可以用这个指令办到,如:
# 显示目前设定的中断点 (gdb) info b # 显示目前设定的 display (gdb) info display # 显示 eax 的值 (gdb) info register eax
11. gdb的推出使用命令quit
12. insight的使用
如果使用过windows下的IDE,那么insight应该很快就可以上手。操作过程基本相同。
sudo apt-get install insight
insight
注意insight是完全基于gdb的IDE,现在已经有功能更加强大的linux下的IDE,比如Eclipse