Linux下的程序调试

来源:互联网 发布:iphone摄影软件推荐 编辑:程序博客网 时间:2024/04/29 15:28

Linux下的C、C++程序常常会因为内存访问错误等原因造成segment fault(段错误),此时如果系统core dump功能是打开的,那么将会有内存映像转储到硬盘上来,之后可以用gdb对core文件进行分析,还原系统发生段错误时刻的堆栈情况。这两天哥试着学习了下linux下的程序调试,虽然没有VS集成环境那样直观直接,但对于定位错误发生点还是很给力!记录一下学到的知识。

1. 最重要的,在Gcc编译时,要使用 -g 选项, 需要更多调试信息,可以使用-ggdb 选项(此时要求用户对所有链接的库都有访问权)。


2. 要检查系统对Corefile的大小限制,使用ulimit -a可以查看系统core文件的大小限制。 如果ulimit -c 看到的结果是0的话,是不会输出corefile的。使用ulimit -c [kbytes]可以设置系统允许生成的core文件大小,例如ulimit -c 0 不产生core文件ulimit -c 100 设置core文件最大为100kulimit -c unlimited 不限制core文件大小, 一般改为:ulimit -c unlimited.

3. 找到程序崩溃时生成的corefile。某些时候,对于几个文件的小型程序,corefile一般在与源文件相同的地方。对于大型的代码库,可能通过环境变量配置了corefile的输出所在, 一般在/home/corefile文件夹下。

4. 使用gdb 开始调试,格式: gdb prog_name corefile_name

5. 使用run命令,在gdb调试状态下运行程序,程序在运行崩溃的地方出现提示,这对于小型程序比较有用。大型程序,run 之后并不一定能复现使程序崩溃的场景 。

6. 使用backtrace 命令打印函数调用栈!backtrace命令将显示出导致错误出现的函数的调用链。

7. 使用List命令,显示导致错误的源代码,一共显示10行,这10行的最后一行是导致错误出现的行。 如果要显示指定的行,则可以用list m, n 来显示 m到n行。

8.使用print 命令显示变量的值。 
8.1 print i : 打印变量 i 的值 
8.2 print i@5: 打印i地址开始的后面5个地址中的内容
8.3 print $1-5: 打印前面第1次print到第5次print打印出来的值 
8.4 print pTr@5: 打印与pTr相关的前5个地址

9. 使用whatis 命令 查看某个变量的类型: 
whatis i ---》 type = int

10. 使用break命令设置断点:
break linenum
break funcname
break filename : linenum
break linenum if expr
break funcname if expr

11. 用search和reverse-search 来查找源文件中的字符串,gdb将会返回字符串所在的行。
0 0
原创粉丝点击