gdb学习(二)[第二版]
查看运行时数据
print - 查看变量值
ptype – 查看变量类型
#ptype i
#ptype “aaa” 打印字符串”aaa”的类型
#ptype array 打印数组array的类型
#ptype main 打印main函数的类型
print array – 查看数组
#p arr1
#p arr1[2] 查看数组arr2第三个元素值
#p &arr1[2] 打印数组元素的地址
#p &arr1 打印数组首地址,与p &arr1[0]作用类似
print *array@len – 查看动态内存
#p *arr2@10
#p *arr2@15 #将数组越界之后的内存也打印出来了
#p *arr@10 #静态的数组也可以改方式打印
#p arr[2]@2 #从arr[2]开始的两个元素
#p arr@2 #打印两个数组
print x=5 – 动态改变运行时数据
#print i = 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命令 or bt命令:栈回溯,显示导致段错误的执行函数树
wh命令查看程序代码窗口
core文件调试
1、core文件
在程序崩溃时,一般会生成一个文件叫core文件。core文件记录的是程序崩溃时的内存映像,并加入调试信息。core文件生成的过程叫做core dump
2、设置生成core文件
ulimit -c #查看core-dump状态
ulimit -c 数字 (如:ulimit -c 1024)
ulimit -a #用于查看当前所有状态信息
将ulimit -c unlimited写入~/.bashrc,则默认会生成core文件
3、gdb利用core文件调试
gdb 程序名 [core-file] #如:gdb bugging core
gdb学习(二)[第二版]的更多相关文章
- gcc学习(二)[第二版]
头文件与库文件 1.概要 在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明. 库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的.它 ...
- gdb学习(一)[第二版]
概述 gdb是GNU debugger的缩写,是编程调试工具. 功能 1.启动程序,可以按照用户自定义的要求随心所欲的运行程序. 2.可让被调试的程序在用户所指定的断点处停住 (断点可以是条件表达式) ...
- Makefile学习(二)[第二版]
复杂实例 #演示样例1:在上一个演示样例的基础上再添加一个可运行文件03test[改动之处已标红] .PHONY: clean all CC = gcc CFLAGS = -Wall -g BIN = ...
- TensorFlow 深度学习中文第二版·翻译完成
原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...
- python基础学习二——第二天
对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性 一.int 首先我们来查看一下int包含了哪些函数 # python3.x dir(int) # ['__a ...
- gcc学习(一)[第二版]
gcc简介 1. gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C Compiler),作者为Richard Stallman,是GNU项目的奠基者 ...
- Makefile学习(一)[第二版]
简单介绍 1)make:利用 make 工具能够自己主动完毕编译工作.这些工作包含:假设仅改动了某几个源文件,则仅仅又一次编译这几个源文件[make通过比对对应的.c文件与.o文件的时间];假设某个头 ...
- Makefile学习(三)[第二版]
make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当 ...
- 《Java程序设计与数据结构教程(第二版)》学习指导
<Java程序设计与数据结构教程(第二版)>学习指导 欢迎关注"rocedu"微信公众号(手机上长按二维码) 做中教,做中学,实践中共同进步! 原文地址:http:// ...
随机推荐
- iOS中的NSURLProtocol
转自:iOS知识小集 NSURLProtocol类(注意,这个不是协议)经常用于实现一些URL Loading System相关的黑魔法.它可以拦截URL Loading System相关的网络请求, ...
- Mongo 整体架构介绍(1)-------分片集群
摘要 在mongo初识文中介绍了mongo与cassandra的主要区别,以及mongo物理部署架构图.本文接着上一篇的mongo 架构图,来继续讲分片集群. 分片介绍 shard key mongo ...
- iOS 10 适配 ATS
一. HTTPS 其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的 ...
- Hibernate之综合问题
n + 1问题 query.iterate()方式返回迭代查询会开始发出一条语句:查询所有记录ID语句 Hibernate: select student0_.id ascol_0_0_from t_ ...
- XML之SAX解析模型
DOM解析会把整个XML文件全部映射成Document里的树形结构,当遇到比较大的文件时,它的内存占用很大,查找很慢 SAX就是针对这种情况出现的解决方案,SAX解析器会从XML文件的起始位置起进行解 ...
- Swift基础之对FMDB第三方的使用方法
相信大家都熟悉OC使用FMDB第三方库,进行数据库操作,增.删.改.查,现在我就来利用代码展示一下Swift对此库的使用方法,我是通过Pods添加的第三方库,如果手动添加记得创建桥接文件,在文件中调用 ...
- 剑指Offer——携程笔试题+知识点总结
剑指Offer--携程笔试题+知识点总结 情景回顾 时间:2016.9.17 19:10-21:10 地点:山东省网络环境智能计算技术重点实验室 事件:携程笔试 总体来说,携程笔试内容与其它企业笔试题 ...
- Linux内核线程
内核线程是直接由内核本身启动的进程.内核线程实际上是将内核函数委托给独立的进程,与系统中其他进程"并行"执行(实际上,也并行于内核自身的执行),内核线程经常被称为内核"守 ...
- iOS关于图片点到像素转换之杂谈
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 不管是以什么方法生成的图片,是从磁盘上读取的,还是从其他对象中 ...
- sql的简单提高效率方法
少用in操作(效率极差),尽量用表关联代替 select要指定列,不要*(*会读入所有数据,而指定列则只提取涉及的列,减少io) 尽量有where(减少读取量),where操作列尽量有索引(加快查询) ...