gdb学习(二)[第二版]
查看运行时数据
print-查看变量值
ptype–查看变量类型
#ptypei
#ptype“aaa”打印字符串”aaa”的类型
#ptypearray打印数组array的类型
#ptypemain打印main函数的类型
printarray–查看数组
#parr1
#parr1[2]查看数组arr2第三个元素值
#p&arr1[2]打印数组元素的地址
#p&arr1打印数组首地址,与p&arr1[0]作用类似
print*array@len–查看动态内存
#p*arr2@10
#p*arr2@15#将数组越界之后的内存也打印出来了
#p*arr@10#静态的数组也可以改方式打印
#parr[2]@2#从arr[2]开始的两个元素
#parr@2#打印两个数组
printx=5–动态改变运行时数据
#printi=1000
程序错误
编译错误:编写程序的时候没有符合语言规范导致编译错误【语法错误】。
运行时错误:编译器检查不出这种错误,但在运行的时候可能会导致程序崩溃【如:内存地址非法访问】。
逻辑错误:编译和运行都很顺利,但是执行结果不对
gdb调试逻辑错误
//示例-实现逆序输出字符串hello,但是却没有任何输出
#include <stdio.h>
int main(void)
{
int i;
char str[6] = "hello";
char reverse_str[6] = "";
printf("%s\n", str);
for (i=0; i<5; i++)
reverse_str[5-i] = str[i];
//Error:应该是reverse_str[4-i]...
printf("%s\n", reverse_str);
return 0;
}
gdb调试段错误
段错误是由于访问非法地址而产生的错误。
1、访问系统数据区,尤其是往系统保护的内存地址写数据。最常见就是给一个0地址指针赋值
2、内存越界(数组越界,变量类型不一致等)访问到不属于你的内存区域
//示例#include <stdio.h> #include <stdlib.h> void segfault1(){ int *p = NULL; *p = 100; } void segfault2() { char buf[1] = "a"; buf[13] = 'A'; printf("%c\n",buf[13]); } void segfault3(){ char buf[1] = "a"; buf[10] = 'A'; printf("%c\n",buf[10]); } int main() { segfault1(); //segfault2(); //segfault3(); return 0; }
where命令orbt命令:栈回溯,显示导致段错误的执行函数树
wh命令查看程序代码窗口
core文件调试
1、core文件
在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做coredump
2、设置生成core文件
ulimit-c#查看core-dump状态
ulimit-c数字(如:ulimit-c1024)
ulimit-a#用于查看当前所有状态信息
将ulimit-cunlimited写入~/.bashrc,则默认会生成core文件
3、gdb利用core文件调试
gdb程序名[core-file]#如:gdbbuggingcore
更多相关文章
- Linux 2.6.x 内核模块加载错误 “Invalid module format” 解决
- 在用apt源安装mysql-server时出现如下错误,需要安装mysql-server-
- 存储过程放在sql脚本里,命令行导入总是提示错误
- 解决缺少sql头文件编译错误
- postgresql 数组 多了引号 空格处理
- “已有打开的与此命令相关联的 DataReader,必须首先将它关闭 ”错
- Mysql5.7.10版本安装后空密码登录,退出后提示密码错误连接不上解
- PostgreSQL无法加载库未知错误14001
- QT 使用QSqlQuery时候的 错误,。。。。