gdb调试方法

    gdb、arm-linux-gdb以及gdbserver的安装过程在此略去,这里主要简要记录开发过程中的主要流程和使用的主要命令。

1、PC调试

    PC调试,就是调试PC上的程序。

1.1  编译程序

    使用gcc编译程序,为了使用gdb进行调试,加上选项-g:

$ gcc test.c -g # 加上-g选项

1.2 加载程序

    先启动gdb工具,然后使用file命令加载需要调试的程序:

$ gdb         # 启动gdb工具
$ file a.out  # 加载程序a.out
1.3 运行程序

    加载程序后,可以使用r命令运行:

$ r          # run

1.4 设置/删除/查看断点

$ b func1     # 在函数func1处设置断点
$ b 18        # 在第18行处设置断点
$ d 2         # 删除编号为2的断点 
$ d           # 删除所有断点
$ clear       # 清除所有断点
$ clear 18    # 清除第18行处的断点
$ clear func1 # 清除函数func1处的断点
$ info b      # 查看当前设置的所有断点

1.5 继续运行

    设置断点后,可以使用c命令继续从断点处开始执行程序(使用r命令会使得程序重新运行)

$ c          # continue
1.6 单步运行

    可以使用s命令进行单步调试(step in,会跳进调用的函数里面!)

$ s          # step, (step in)
$ n          # next, (step over)

1.7  查看变量

$ p  tmp     # print 变量tmp的值

1.8 退出

$ quit      # 退出gdb

2、交叉调试

    交叉调试,就是通过PC来调试开发板上的程序。

2.1 编译程序

    使用交叉编译工具链编译好程序,然后将其通过nfs的方式共享给开发板使用

$ arm-linux-gcc test.c -g  # 加上-g选项
2.2 启动gdbserver

    假设开发板上已经安装好gdbserver工具,并且上面交叉编译好的程序a.out已经通过nfs共享到开发板,则可以启动gdbserver如下

$ gdbserver  192.168.1.198:2345 a.out   # 192.168.1.198为PC的IP,可略,2345为端口号(可以改为其它可用值);a.out为开发板当前目录下的程序
$ gdbserver  :2345 a.out                # 同上,只是略去了PC的IP

2.3 启动arm-linux-gdb并连接开发板

    假设在PC已经安装好arm-linux-gdb交叉调试工具,则可以启动并调试开发板上的a.out

$ arm-linux-gdb a.out  # a.out在PC上也要有一份(和开发板上的那个a.out是完全一样的!),否则不能设置断点
2.4 开始调试

    这时候可以使用跟PC调试时同样的方法去调试程序了。需要注意的是,这时不能使用r命令来执程序,而要使用c来代替。

3、core file

    在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数[9]。对于core file,参考资料[12]P234、P236和P248都有描述。

3.1 生成core file[9]

$ ulimit -c              # 查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
$ ulimit -c filesize     # 限制core文件的大小,如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。
$ ulimit -c unlimited    # core文件的大小不受限制,为了调试,应该使用这个设置。
3.2 查看core file[9]

    查看core file,需要借助gdb工具,使用其bt或者where命令。关于加载core file和可执行文件,有几种不同的调用方式。

3.2.1 调用方式1

$ gdb a.out
(gdb) core-file corefile
(gdb) bt                  # backtrace

3.2.2 调用方式2

$ gdb -core=corefile
(gdb) file a.out
(gdb) bt 
3.2.3 调用方式3
$ gdb -c corefile
(gdb) file a.out
(gdb) bt

3.2.4 where命令

$ gdb -c core
(gdb) where

3.3 嵌入式core文件调试[9]

3.3.1 直接在开发板上调试

    如果开发板上有gdb工具,可以直接使用它来进行core调试。

3.3.2 交叉调试

    如果开发板上没有gdb工具,可将开发板的环境(依赖库)、可执行文件和core文件拷贝到PC的Linux下进行调试。这时使用的是arm-linux-gdb,方法同3.2。另外,还需要在待运行gdb的路径下建立.gdbinit,配置文件内容:

set solib-absolute-prefix /home/liyihai/embeddedSystem/arago-2011.09/armv5te/bin  # YOUR_CROSS_COMPILE_PATH
set solib-search-path /home/liyihai/embeddedSystem/arago-2011.09/armv5te/lib      # YOUR_DEVELOPER_TOOLS_LIB_PATH
handle SIG32 nostop noprint pass
    这样子在调试时就不会说找不到依赖库了。

参考资料

[1]gdb源码下载

[2]嵌入式Linux的GDB调试环境的建立

[3]GDB+GdbServer: ARM程序调试

[4]GDB 命令详细解释

[5]GDB十分钟教程

[6]Linux gdb设置和管理断点

[7]gdbserver远程调试

[8]用gdb和gdbserver远程调试tq2440

[9]linux下core文件调试方法

[10]Linux下调试core文件的方法

[11]Linux下core文件调试方法

[12]《UNIX环境高级编程》2nd

[13]Linux core dump详解 

你可能感兴趣的:(gdb调试方法)