GDB调试方法(上)

一般来说 GDB 主要调试的是 C/C++ 的程序。要调试 C/C++ 的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器( cc/gcc/g++ )的 -g 参数可以做到这一点。如:

    > cc -g hello.c -o hello
    > g++ -g hello.cpp -o hello

如果没有 -g ,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用 -g 把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用 gdb 来调试他。

启动 GDB 的方法有以下几种:

    1 、 gdb <program>
       program 也就是你的执行文件,一般在当然目录下。

    2 、 gdb <program> core
       用 gdb 同时调试一个运行程序和 core 文件, core 是程序非法执行后 core dump 后产生的文件。

    3 、 gdb <program> <PID>
       如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程 ID 。 gdb 会自动 attach 上去,并调试他。 program 应该在 PATH 环境变量中搜索得到。



GDB 启动时,可以加上一些 GDB 的启动开关,详细的开关可以用 gdb -help 查看。我在下面只例举一些比较常用的参数:

    -symbols <file>
    -s <file>
    从指定文件中读取符号表。

    -se file
    从指定文件中读取符号表信息,并把他用在可执行文件中。

    -core <file>
    -c <file>
    调试时 core dump 的 core 文件。

    -directory <directory>
    -d <directory>
    加入一个源文件的搜索路径。默认搜索路径是环境变量中 PATH 所定义的路径。

GDB 的命令概貌
———————

启动 gdb 后,就你被带入 gdb 的调试环境中,就可以使用 gdb 的命令开始调试程序了, gdb 的命令可以使用 help 命令来查看,如下所示:

    /home/hchen> gdb
    GNU gdb 5.1.1
    Copyright 2002 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB. Type "show warranty" for details.
    This GDB was configured as "i386-suse-linux".
    (gdb) help
    List of classes of commands:

    aliases -- Aliases of other commands
    breakpoints -- Making program stop at certain points
    data -- Examining data
    files -- Specifying and examining files
    internals -- Maintenance commands
    obscure -- Obscure features
    running -- Running the program
    stack -- Examining the stack
    status -- Status inquiries
    support -- Support facilities
    tracepoints -- Tracing of program execution without stopping the program
    user-defined -- User-defined commands

    Type "help" followed by a class name for a list of commands in that class.
    Type "help" followed by command name for full documentation.
    Command name abbreviations are allowed if unambiguous.
    (gdb)

gdb 的命令很多, gdb 把之分成许多个种类。 help 命令只是例出 gdb 的命令种类,如果要看种类中的命令,可以使用 help <class> 命令,如: help breakpoints ,查看设置断点的所有命令。也可以直接 help <command> 来查看命令的帮助。


gdb 中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在 Linux 下,你可以敲击两次 TAB 键来补齐命令的全称,如果有重复的,那么 gdb 会把其例出来。
  
    示例一:在进入函数 func 时,设置一个断点。可以敲入 break func ,或是直接就是 b func
    (gdb) b func
    Breakpoint 1 at 0x8048458: file hello.c, line 10.

    示例二:敲入 b 按两次 TAB 键,你会看到所有 b 打头的命令:
    (gdb) b
    backtrace break      bt
    (gdb)

    示例三:只记得函数的前缀,可以这样:
    (gdb) b make_ < 按 TAB 键 >
    (再按下一次 TAB 键,你会看到 : )
    make_a_section_from_file     make_environ
    make_abs_section             make_function_type
    make_blockvector             make_pointer_type
    make_cleanup                 make_reference_type
    make_command                 make_symbol_completion_list
    (gdb) b make_
    GDB 把所有 make 开头的函数全部例出来给你查看。

    示例四:调试 C++ 的程序时,有可以函数名一样。如:
    (gdb) b 'bubble( M-?
    bubble(double,double)    bubble(int,int)
    (gdb) b 'bubble(
    你可以查看到 C++ 中的所有的重载函数及参数。(注: M-? 和 “ 按两次 TAB 键 ” 是一个意思)

要退出 gdb 时,只用发 quit 或命令简称 q 就行了。



GDB 中运行 UNIX 的 shell 程序
————————————

在 gdb 环境中,你可以执行 UNIX 的 shell 的命令,使用 gdb 的 shell 命令来完成:

    shell <command string>
    调用 UNIX 的 shell 来执行 <command string> ,环境变量 SHELL 中定义的 UNIX 的 shell 将会被用来执行 <command string> ,如果 SHELL 没有定义,那就使用 UNIX 的标准 shell : /bin/sh 。(在 Windows 中使用 Command.com 或 cmd.exe )

还有一个 gdb 命令是 make :
    make <make-args>
    可以在 gdb 中执行 make 命令来重新 build 自己的程序。这个命令等价于 “ shell make <make-args> ” 。

在 GDB 中运行程序
————————

当以 gdb <program> 方式启动 gdb 后, gdb 会在 PATH 路径和当前目录中搜索 <program> 的源文件。如要确认 gdb 是否读到源文件,可使用 l 或 list 命令,看看 gdb 是否能列出源代码。

在 gdb 中,运行程序使用 r 或是 run 命令。程序的运行,你有可能需要设置下面四方面的事。

1 、程序运行参数。
    set args 可指定运行时参数。(如: set args 10 20 30 40 50 )
    show args 命令可以查看设置好的运行参数。

2 、运行环境。
    path <dir> 可设定程序的运行路径。
    show paths 查看程序的运行路径。
    set environment varname [=value] 设置环境变量。如: set env USER=hchen
    show environment [varname] 查看环境变量。

3 、工作目录。
    cd <dir> 相当于 shell 的 cd 命令。
    pwd 显示当前的所在目录。

4 、程序的输入输出。
    info terminal 显示你程序用到的终端的模式。
    使用重定向控制程序输出。如: run > outfile
    tty 命令可以指写输入输出的终端设备。如: tty /dev/ttyb


调试已运行的程序
————————

两种方法:
1 、在 UNIX 下用 ps 查看正在运行的程序的 PID (进程 ID ),然后用 gdb <program> PID 格式挂接正在运行的程序。
2 、先用 gdb <program> 关联上源代码,并进行 gdb ,在 gdb 中用 attach 命令来挂接进程的 PID 。并用 detach 来取消挂接的进程。



暂停 / 恢复程序运行
—————————

调试程序中,暂停程序运行是必须的, GDB 可以方便地暂停程序的运行。你可以设置程序的在哪行停住,在什么条件下停住,在收到什么信号时停往等等。以便于你查看运行时的变量,以及运行时的流程。

当进程被 gdb 停住时,你可以使用 info program 来查看程序的是否在运行,进程号,被暂停的原因。

在 gdb 中,我们可以有以下几种暂停方式:断点( BreakPoint )、观察点( WatchPoint )、捕捉点( CatchPoint )、信号( Signals )、线程停止( Thread Stops )。如果要恢复程序运行,可以使用 c 或是 continue 命令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值