在linux编写C语言调试时,以前遇到问题时,特别是内存溢出等问题,都是通过手动添加调试信息来逐步锁定出问题的语句。这样做虽然简单,但比较麻烦。在一些负责程序或者不是自己写的程序时会难以定位,所以还算需要借助调试工具来定位。
1)gdb
编译时加上-g标志即可。
运行时 gdb -g app 即可进入gdb调试模式
一般指令就是1)list 2)break n 3) run 4)next 5)where 6)bt
一般流程是r 运行 比如到内存溢出时,会停止 此时输入where 可以看到此时运行到了什么指令,bt可以查看此时的堆?.list可以查看此时附件的代码.这样基本可以较快的找到问题.
2)使用core文件
使用core文件,是为了在程序异常退出时,可以保留那是的信息。
需要系统生存core文件需要做如下设置 1)查看/proc/sys/kernel/core_pattern 这是设置生成core文件的路径和命名格式
core_uses_pid 这是设置是否包含pid
临时设置:sysctl -w kernel.core_used_pid=1
sysctl -w kernel.core_pattern=/tmp/core-%e-%p 设置为带名字和pid
永久设置:vim /etc/sysctl.conf
kernel.core_used_pid=1
kernel.core_pattern=/tmp/core-%e-%p
设置后无须重启立即生效 sysctl -p /etc/sysctl.conf
然后查看当前用户:ulimit -c 查看那core的大小设置 如果为0 需要设置ulimit -c unlimited 如果需要永久设置需要在profile。
这样程序编译时加入-g。然后运行程序 当程序异常退出时会在/tmp下面生成对应的core文件。
将core文件和执行文件放在一起 gdp hello core-hello-11
这时可以看到core里面的详细信息,可以定位到hello里面什么地方出现问题.
阅读(383) | 评论(0) | 转发(0) |