在编程调试中,经常出现段错误,此时可用gdb调试。具体方法为注册段错误信号处理函数,在处理函数中启动gdb。
具体代码如下:
void segv_handler(int no)
{
char buf[512];
char cmd[512];
FILE *file;

snprintf(buf, sizeof(buf), "/proc/%d/cmdline", getpid());
if(!(file = fopen(buf, "r")))
{
exit(EXIT_FAILURE);
}
if(!fgets(buf, sizeof(buf), file))
{
eixt(EXIT_FAILURE);
}
if(buf[strlen(buf) - 1 ] == '\n')
{
buf[strlen(buf) -1] = '\0';
}
snprintf(cmd, sizeof(cmd), "gdb %s %d", buf, getpid());
system(cmd);
}

注册函数:
signal(SIGSEGV, segv_handler);
下面转自一些总结:
作为一名程序猿,日常开发中解决各种bug是不可避免的。对于简单的bug通过日志分析,或者增加打印信息就能很快定位到原因并解决。但是对于某些比较复杂的情况,想要定位到bug往往十分困难。查阅了很多资料,经过不断尝试,我发现gdb调试能够起到很大的帮助。下面我将对使用gdb的一些常用技巧和实例做下总结。
下面总结下比较关键的几个用法:
一、启动GDB调试
使用gdb调试首先在编译程序时加上-g参数:$ gcc –g –o foo foo.c
启动gdb调试有多种方法,可以根据不同的场景选择合适的方式,这也是gdb比较好用的地方。
1. 程序没有运行时,gdb +<program> 直接用gdb运行程序;
2. 程序运行中的gdb调试有两种方式:
a.ps查看程序的PID,gdb + <program> + PID ,自动挂接到已运行的程序;
b.ps产看程序的PID,gdb + <program>运行gdb后,用attach + PID指令挂接到程序, 并用detach来取消挂接的进程。
3. 程序已经死掉后,gdb +<program> + core文件进行调试,core文件是程序非法执行后产生的“核心转储”文件。有些情况下core不能生成,需要用ulimit -c unlimited指令先设置系统环境。
二、针对第二种gdb启动方式,可以有如下实现方式。
程序发生段错误,但是该异常发生有一定的随机性,为了捕获异常并进行gdb调试,在程序中捕获SIGSEGV信号并进行如下处理,这样当程序运行出现段错误时直接进入gdb调试环境。

三、gdb调试常用指令

关于gdb调试的常用指令及介绍可以参考这里,http://blog.csdn.net/liwf616/article/details/46833107
Gdb环境下直接按下回车表示执行上一条命令
1. break 设置断点,
break10 设置断点,在源程序第10行
breakfunc 设置断点,在func函数入口处
infobreak 查看断点信息
2. run 运行程序,可简写为r
3. next 单步跟踪,函数调用当作一条简单语句执行,可简写为n
step 单步跟踪,函数调进入被调用函数体内,可简写为s
stepi 或si单步跟踪一条机器指令
nexti 或ni单步跟踪一条机器指令
4. continue 继续运行程序,可简写为c
5. print 打印变量、字符串、表达式等的值,可简写为p
p count 打印count的值
p cou1+cou2+cou3 打印表达式值
6. bt 查看函数堆栈
7. finish 退出函数
8. quit 退出GDB
9. shell 不退出GDB就使用shell命令
10. make <make-args>不退出GDB就重新编译程序
11. set args指定运行时参数。(如:set args10 20 30 40 50)
showargs查看设置好的运行参数。
12. path <dir>设定程序的运行路径。
showpaths 查看程序的运行路径。
13. set environment varname [=value] 设置环境变量。如:setenv USER=hchen
showenvironment [varname] 查看环境变量。
14. 其他
cd<dir> 相当于shell的cd命令。
pwd 显示当前的所在目录。
infoterminal 显示程序用到的终端模式。
tty指写输入输出的终端设备。如:tty /dev/ttyb
until在一个循环体内单步跟踪时,该命令运行程序到退出循环体。简写u
四、多线程调试
用gdb调试的好处是可以查看程序运行时的堆栈等信息,可以很直观的发现问题。
info threads //显示当前可调试的所有线程,每个线程前面有一个gdb为其分配的ID;
thread ID //切换到该ID对应的线程;
bt //显示该线程的堆栈信息
thread apply all bt //显示所有线程堆栈信息
break fun.c:123 thread ID //设置指定线程的断点
set scheduler-locking off|on|step //off表示不锁定任何线程,所有线程都执行;on只有当前线程执行;step在单步时除了next过一个函数外,只有当前线程执行

gdb使用_转的更多相关文章

  1. 使用gdb调试游戏服务器

    前言 谈论gdb重要性 一般来说.提gdb,命令用于调试."命令",用户是几乎相同的复杂话.而事实确实如此,实际的开发调试必须用到gdb. 如今.大多数Linux系统是存在于ser ...

  2. Linux安全审计命令

    安全审计 数据分析 capinfos xxx.pcap 产看数据包基本信息 日志分析 who /var/log/wtmp #查看登录用户信息 哈希校验 sha265 文件名 md5sum 文件名 &g ...

  3. rust-vmm 学习

    V0.1.0 feature base knowledge: Architecture of the Kernel-based Virtual Machine (KVM) 用rust-vmm打造未来的 ...

  4. nginx模块_使用gdb调试nginx源码

    工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段. ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正. 熟悉gdb的使用 这里 ...

  5. arcgis gdb含下划线_和%的查询 by gisoracle

    XMMC LIKE '%\_%' ESCAPE '\'              by gisoracle 2015.1.25 XMMC LIKE  '%\%%' escape '\'         ...

  6. GDB调试笔记

    参考资料:GDB调试精粹及使用实例 # 调试实例 #include <iostream> #include <cstring> using namespace std; ][] ...

  7. ubuntu: qemu+gdb 调试linux kernel 学习笔记

    声明: 本笔记内容并非本人原创,90%来自网络资料的整合.同时,由于自己是刚刚接触qemu & gdbserver remote debug,本文也就算不得教程,仅供有缘人参考而已. ---- ...

  8. ArcGIS10的GDB文件解析(初步)

    早就应该写一写关于esri的一些改变 参考http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#//006z000000tr00000 ...

  9. Linux学习笔记15——GDB 命令详细解释【转】

    GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...

随机推荐

  1. Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    引用自 :http://www.2cto.com/database/201307/224836.html   Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍 先假设有这么一个表 ...

  2. 【iCore3双核心板】扩展引脚分布

    PDF 版下载: http://files.cnblogs.com/files/xiaomagee/iCore3%E6%89%A9%E5%B1%95%E5%BC%95%E8%84%9A%E5%88%8 ...

  3. 【液晶模块系列基础视频】4.2.X-GUI图形界面库-画矩形函数简介

    [液晶模块系列基础视频]4.2.X-GUI图形界面库-画矩形函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址: ...

  4. Java判断一个时间是否在另一个时间段内

    需求:当时间在凌晨0点至0点5分之间程序不执行. 也就是实现判断当前时间点是否在00:00:00至00:05:00之间 方法: Java代码 : /** * 判断时间是否在时间段内 * * @para ...

  5. PHP 错误与异常 笔记与总结(18 )页面重定向实现

    在发生错误时,将用户重定向到另一个页面. <?php header('content-type:text/html; charset=utf-8'); class ExceptionRedire ...

  6. Javascript 笔记与总结(2-7)对象

    html: <h1>找对象</h1> <div id="div1"> <p>p1</p> <p>p2< ...

  7. Web 在线文件管理器学习笔记与总结(3)创建文件

    ① 创建文件 a. 文件名的合法性:不能包含 \/:*"<>| 等特殊字符 b. 检测当前目录下是否存在同名文件,如果存在提示请重命名后创建,如果不存在则直接创建 index.p ...

  8. MySQL存储引擎总结

    MySQL存储引擎总结 作者:果冻想 字体:[增加 减小] 类型:转载   这篇文章主要介绍了MySQL存储引擎总结,本文讲解了什么是存储引擎.MyISAM.InnoDB.MEMORY.MERGE等内 ...

  9. JQ+rotate插件实现图片旋转,兼容IE7+ \ CHROME等浏览器

    插件:/jquery.rotate.min.js CODE: <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  10. Delphi 记录类型- 结构指针

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...