gdb调试

来源:互联网 发布:那些淘宝店铺质量又好 编辑:程序博客网 时间:2024/06/07 00:51

gdb调试

执行ulimit -c unlimited,设置core文件的大小。
1 要使用gdb,首先在编译时加入-g命令,如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
2 gdb启动
启动GDB的方法有以下几种:
   1> gdb <program>
       program也就是你的执行文件,一般在当然目录下。
   2> gdb <program> core
       用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。
   3> gdb <program> <PID>
       如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

3常用命令描述

info b 查看所有断点。

break   行号         在某行设置短点。
删除断点
clear : 删除程序中所有的断点
clear 行号 : 删除这行的断点
clear 函数名 : 删除该函数的断点
delete b_id1 b_id2 ... : 删除指定编号的断点

break    可带如下参数:
linenum                 本地行号,即list命令可见的行号
filename:linenum  制定个文件的行号
function                函数,可以是自定义函数也可是库函数,如open
filename:function  制定文件中的函数
condtion                条件
*address      地址,可是函数,变量的地址,此地址可以通过info add命令得到。
例如:
break 10    
break test.c:10
break main
break test.c:main
break system
break open

backtrace(或bt)     查看各级函数调用及参数
finish     连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号     选择栈帧
info(或i) locals     查看当前栈帧局部变量的值
list(或l)     列出源代码,接着上次的位置往下列,每次列10行
list 行号     列出从第几行开始的源代码
list 函数名     列出某个函数的源代码
next(或n)     执行下一行语句
print(或p)     打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q)     退出gdb调试环境
set var     修改变量的值
start     开始执行程序,停在main函数第一行语句前面等待命令
step(或s)     执行下一行语句,如果有函数调用则进入到函数中

stepin 可简写s     进入函数。
带参调试 
例如一个程序名为prog 参数为 -l a -C abc
则,运行gcc/g++ -g  prog.c/cpp -o prog
就可以用gdb调试程序prog
#gdb prog
进入gdb调试界面
输入参数命令set args 后面加上程序所要用的参数,注意,不再带有程序名,直接加参数,如:
set args -l a -C abc
回车后输入
r

即可。

调试动态库

1 创建3个文件

get.h

 int get ();
 int set (int a);


get.cpp

#include <stdio.h>
#include "get.h"

static int x=0;
int get ()
{
        printf ("get x=%d\n", x);
        return x;
}

int set (int a)
{
        printf ("set a=%d\n", a);
        x = a;
        return x;
}

pk.cpp

#include <stdio.h>
#include "get.h"
int main (int argc, char** argv)
{
        int a = 100;
        int b = get ();
        int c = set (a);
        int d = get ();

        printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);

        return 0;
}

执行如下命令:

g++ get.cpp -shared -g -fPIC -DDEBUG -o libggg.so
g++ pk.cpp -o app -Wall -g -lggg -L`pwd`

现在开始调试:

#gdb ./app

b main
b set
r
多次执行n后,打印printf ("set a=%d\n", a);即可以进入动态库。

0 0