想要调试,首先需要加上-g
g++ -g hello.c -o hello 或者g++ -g -o hello hello.c
启动gdb方法:
gdb 可执行文件名
gdb core.xxx
gdb program 进程ID
gdb断点调试:
gdb hello, 则进入hello程序的gdb调试界面
输入l(list), 即(gdb):> l
则会列出源码, 每次按Enter回车则翻出下一页。
b 数字, 则在对应位置设置断点
b 函数名 , 则在对应函数入口处设置断点
r , 开始运行程序
c, 即continue继续运行。
s, 进入函数。
n, 执行单条语句,单步执行
p 变量, 则print该变量的值
bt 查看当前函数堆栈
finish 退出当前函数
q 退出gdb
info local info args
如何生成gdb文件?
ulimit -c unlimited
产生coredump的原因:
内存访问越界:
1.数组下标错误
2.字符串没有结束符,导致遍历或输出错误
线程不安全,线程读写冲突
非法指针: int *a; *a = 1; 注意此时还未指定a所指向的地址。
堆栈溢出: 为局部变量设置了 int a[1000000],过大,导致堆栈不够,溢出
调试coredump的方法:
gdb test core.xxx , 一定要记住,带上可执行文件,不然无法生成符号表。
接着再用bt等去查看怎么回事。