调试利器GDB(上)
什么是GDB:
GDB应用:
静态分析工具与动态分析工具:
GDB启动方式:
GDB启动之后会有一个交互式的命令行,可以输入GDB特定的命令让GDB去工作。
gdb test.out意思是这一次gdb启动关注的是test.out这个进程。
gdb test.out core意思是程序崩溃时产生core文件。
动态连接:
gdb test.out pid意思是gdb去跟踪test.out这个程序文件对应的进程号为pid的进程。
应用示例一:
应用示例二:
实验:
test.c程序如下:
#include <stdio.h>
#include <unistd.h> extern int* g_pointer;
extern void func(); void test_1()
{
printf("test_1() : %p\n", test_1);
} void test_2()
{
printf("test_2() : %p\n", test_2);
} void test_3()
{
printf("test_3() : %p\n", test_3);
} int main(int argc, char *argv[])
{
typedef void(TFunc)();
TFunc* fa[] = {test_1, test_2, test_3};
int i = ; printf("main() : begin...\n"); for(i=; i<argc; i++)
{
printf("argv[%d] = %s\n", i, argv[i]);
} for(i=; i<; i++)
{
fa[i%]();
sleep(argc > );
} printf("g_pointer = %p\n", g_pointer); func(); printf("main() : end...\n"); return ;
}
func.c如下:
#include <stdio.h> int* g_pointer; void func()
{
*g_pointer = (int)"D.T.Software"; return;
}
test程序直接运行会产生段错误:
如果想使用gdb调试,那么程序编译时需要带上调试信息,即:
gcc -g test.c func.c -o test.out
然后使用命令 ulimit -c unlimited,这条命令的意思就是在程序崩溃的时候产生core文件。
再次运行程序结果如下:
可以看到产生了core文件。
下一步就可以借助gdb进行调试了。
可以看到gdb给我们指出了问题,在func.c的第七行。
g_pointer是指向0地址处的。
单独运行gdb并载入test.out:
输入run,结果如下:
gdb会动态的跟踪进程的执行,发现向0地址写东西会立即告诉我们。
再次进行如下的实验:
ctrl+c可以让test.out进程暂停,如果想继续执行,敲入continue:
gdb动态连接的实验:
先启动test.out进程:
在另一个中端里面使用ps aux查看进程号,然后跟踪这个进程:
attach到test.out进程后,这个进程就暂停执行了。
敲入continue继续执行:
执行到最后结果如下:
gdb断点调试:
软件断点只对加载到内存中执行的程序有效。
在flash中执行的程序只能打硬件断点。
break设置的断点总是有效的,tbreak设置的断点只有一次有效。
断点相关操作:
delete删除断点可以指定断点的号,1,2,n都是短点号。
硬件断点应用:
实验:
run命令启动程序后继续向下执行,start启动程序后立即暂停:
可以看到start启动后自动设置了一个临时断点。停止在了main函数的入口处。
打断点:
next会执行下一条指令。
我们不可能用next一直执行下去,需要有其他的手段。
打印一下i的值:
$1、$2代表第一次打印和第二次打印。
我们将i的值设置为了100,再次执行next:
可以看到执行了两次next之后程序到了第41行。
设置一个一次性断点,并继续执行:
程序到了第43行,但是还没有调用func函数。
我们可以通过命令跳过第43行func函数的执行:
跳过func函数,程序没有崩溃,这说明我们之前的程序崩溃发生在func函数中。
在进行第二次调试:
程序到了第25行,我们通过tbreak打一个断点,通过函数名字打断点,然后continue继续执行:
程序停下来了,停在了func函数的第7行:
在第一次调试时,我们确定了是func函数出现了问题,为了确认就是func函数内部出了问题,现在我们通过return强制func函数返回:
返回后继续执行:
启动第三次调试:
当前系统只支持一个硬件断点。
打硬件断点,并继续执行:
程序停在了func的第七行:
打印并设置g_pointer的值:
敲continue继续执行:
可以看到程序正常结束了,没有产生崩溃。
小结:
调试利器GDB(上)的更多相关文章
- linux-c/c++调试利器gdb、ddd小试
linux-c/c++调试利器gdb.ddd小试 原文链接: http://deepfuture.iteye.com/blog/749148 博客分类: C++/C/lisp CC++C#LinuxU ...
- 调试利器GDB(下)
本节我们研究gdb更深层的用法: 数据断点: 可以根据变量的值来监视变量. 数据断点本质是硬件断点,数量有限. watch var_name告诉gdb我们关注var_name这个变量,如果它的值被改变 ...
- Linux C++调试利器-gdb
在Linux上开发后台C++程序时,没有类似Windows VisualStudio那样强大的可视化IDE.为了提高调试效率,快速定位问题,需要掌握gdb工具的一些基本用法. 添加调试符号信息 co ...
- linux 调试利器gdb, strace, pstack, pstree, lsof
1) 如何使用strace+pstack利器分析程序性能? http://www.cnblogs.com/bangerlee/archive/2012/04/30/2476190.html 此文有详细 ...
- gdb 调试利器
1. gdb 调试利器 GDB是一个由GNU开源组织公布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具.对于一名Linux下工作的c++程序猿,gdb是不可缺少的工具: 1 ...
- Windows GUI代码与Windows消息问题调试利器
Windows GUI代码与Windows消息问题调试利器 记得很久前有这么一种说法: 人类区别于动物的标准就是工具的使用.同样在软件开发这个行业里面,对于工具的使用也是高手和入门级选手的主要区别,高 ...
- 理解WebKit和Chromium: 调试Android系统上的Chromium
转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...
- [转] linux下的c/c++调试器gdb
PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...
- 应用调试(二)GDB
title: 应用调试(二)GDBdate: 2019/1/17 21:00:10 toc: true 应用调试(二)GDB gdb下载工具安装交叉工具链设置GDB介绍编译GDBtarget/host ...
随机推荐
- js的中文在网页中显示为乱码
最近的毕业设计写道局部检查用户命是否为空和是否符合规范时 发现页面回显的中文为乱码 then 找到一个和我遇到同样问题的人呐 他说“最近在写一个商城网页的时候遇到了一个问题,那就是javascrip ...
- 路由导航之第一个子模块(HomeModule)
git clone git@github.com:len007/my-angular2-app.git my-angular2-app 开始 一个URL = 一个页面 = 一个Component. 我 ...
- LoadRunner基本简介
# LoadRunner # ## 安装要求 ## 做性能测试的时候,电脑要是一个干净的系统. 尽量是裸装电脑纯净版,不能安装太多的浏览器,支持的有IE.Firefox.chrome ...
- flask 第六章 人工智能 百度语音合成 识别 NLP自然语言处理+simnet短文本相似度 图灵机器人
百度智能云文档链接 : https://cloud.baidu.com/doc/SPEECH/index.html 1.百度语音合成 概念: 顾名思义,就是将你输入的文字合成语音,例如: from a ...
- elasticsearch kabana中创建索引
在kabana中创建索引和索引类型语法 PUT clockin{ "mappings": { "time": { } }} 查询索引下的所有数据 GET clo ...
- winfrom窗体中嵌套WPF控件
前言 本文主要介绍如何在winfrom窗体中嵌套WPF控件, 一来是自己记录一下,而来希望能对有需要的朋友提供实现思路. 如有错误请指出...下面进入正题... -1.前期准备 准备一个建立好的win ...
- 关于解决Mac使用docker安装SQL server for Linux 中文乱码问题
本人是Mac的追随者,无奈本学期数据库课要求使用Microsoft的SQL server.但是Microsoft并没有发布SQL server for Mac ,笔者使用Google搜索后, 发现可以 ...
- admin 显示多对多字段
class BookAdmin(admin.ModelAdmin): def 作者(self, object): return [a.name for a in object.author.all() ...
- 初读"Thinking in Java"读书笔记之第五章 --- 初始化与清理
用构造器确保初始化 构造器可以确保每个对象都会得到初始化,Java毁在创建对象时自动调用构造器. 构造器采用与类名相同的名称,因此并不适合"每个方法首字母小写的风格". 构造器默认 ...
- ForkJoinPool 源码
ForkJoinPool----FJP先看task.fork方法,含义是将当前任务,放到当前线程的工作队列中.但是第一次执行这个方法是在主线程中,主线程是不可能被FJP管理的.那么就进入ForkJoi ...