gdb调试段错误
-
gdb调试段错误
首先打开core采集状态崩溃信息
查看现在的资源限制,对core文件大小的设置
ulimit -c 0
-c指的是允许生成的core的大小,单位字节;
输出是0,那就是最多只能生成0字节==》即不允许生成core文件;
修改对core文件大小的限制:
[test1280@localhost 20170623]
ulimit -c unlimited [test1280@localhost 20170623]$ ./main 段错误 (core dumped) 关键是:
ulimit -c unlimited
设置对core文件大小是无限的。
当然,我们可以使用:
ulimit -c 100
注意这里的100单位是KB。
还可以参考:https://blog.csdn.net/test1280/article/details/73655994
里面还有一些bug的记录-
然后设置gdb程序环境变量
gdb开启调试
调试段错误
首先打开core文件
然后运行程序,出现segment fault,并生成core文件
gdb a.out core
或者直接
gdb a.out
设置断点:
cd到目录下设置断点 再cd回来执行r
设置断点
代码放置在多个文件夹下,设置断点在某一个文件夹下其中一个源文件
比如源文件有:
file1.c file2.c
main.c(包含file1.c file2.c )
如果想在在file1.c中设置一个断点,且这个file还是在另一个目录下
如果我们想在file1.c中的第40行设置断点,我们可以这样:
(gdb)cd ../../../src/test (gdb)b test.cpp:40 //注意这里一定要加上冒号: (gdb)cd ../../../../src/main (gdb)r
设置条件断点
b 17 if i == 8.
在17行设置一个断点,并且只有i==8的时候才会触发.
打印信息
打印当前函数参数值
info args
打印当前函数栈上值信息
info locals
查看寄存器值
info registers
打印内存地址中的数据
x /100dw buffer
x /23dw a 意思是 查看 从a地址开始 23个 4字节 有符号十进制数 输出.
关于x 更加详细见下面
用gdb查看内存格式: x /nfu ptr 说明 x 是 examine 的缩写 n表示要显示的内存单元的个数 f表示显示方式, 可取如下值 x 按十六进制格式显示变量。 d 按十进制格式显示变量。 u 按十进制格式显示无符号整型。 o 按八进制格式显示变量。 t 按二进制格式显示变量。 a 按十六进制格式显示变量。 i 指令地址格式 c 按字符格式显示变量。 f 按浮点数格式显示变量。 u表示一个地址单元的长度 b表示单字节, h表示双字节, w表示四字节, g表示八字节
还可以使用gdb调试打印buffer连续内存地址中数据示例
还可以参考:https://www.cnblogs.com/life2refuel/p/5396538.html
-
gdb确实在我们的项目中很有用了,码住