Study everyday from now on!

linux环境下程序调试-gdb-1

上一篇 / 下一篇  2017-11-30 11:19:10 / 个人分类:测试相关资料

浅谈linux环境下C++程序调试

1       认识gdb

象所有的调试器一样,GDB可以让你调试一个程序,包括让程序在你希望的地方停下,此时你可以查看变量,寄存器,内存及堆栈。更进一步你可以修改变量及内存值。

GDB是一个功能很强大的调试器,它可以调试多种语言。在此我们仅涉及CC++的调试,而不包括其它语言。

还有一点要说明的是,GDB是一个调试器,而不象VC一样是一个集成环境。

在你调试你的程序之前,当你编译你的源程序时,不要忘了-g选项或其它相应的选项,才能将调试信息加到你要调试的程序中。例如:gcc -g -o hello hello.c

2       gdb调试的几种方式

2.1     使用gdb启动程序进行调试

主要有三个步骤:

A) 使用gdb启动程序,这边以RealTask为例

bjabmdev@linux5:/app/bjabmdev>gdb RealTask

GNU gdb (GDB) SUSE (7.5.1-0.7.29)

Copyright (C) 2012 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-suse-linux".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from /app/bjabmdev/bin/RealTask...done.

(gdb)

B) 打上需要调试的地方打上断点

(gdb) b CBillToItemService.cpp:42

No source file named CBillToItemService.cpp.

Make breakpoint pending on future shared library load? (y or [n]) y

Breakpoint 1 (CBillToItemService.cpp:42) pending.

(gdb)

C) 将进程运行起来

(gdb) r -p RealTask -a BILL_TO_ITEM -n BILL_TO_ITEM -l 0 -r 1010 -h 41

D) 此时,如果进程运行到你打断点的位置就会停住

2.2     使用gdb调试core文件信息

在使用gdb调试core文件过程中,首先我们需要知道core文件是哪个程序产生的,可以执行以下指令得到程序信息

bjabmdev@linux5:/app/bjabmdev/src/bill/process/obj> file core

core: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from 'RealTask -p RealTask -a REAL_DEDUCT -n REAL_DEDUCT -l 0 -r 1010'

bjabmdev@linux5:/app/bjabmdev/src/bill/process/obj>

知道程序后,使用就可以使用gdb调试core文件啦

bjabmdev@linux5:/app/bjabmdev/src/bill/process/obj> gdb RealTask core

GNU gdb (GDB) SUSE (7.5.1-0.7.29)

Copyright (C) 2012 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

进入调试状态后可以使用where指令查看程序入口以及最终core的位置

得到这些信息后就可以使用第4章的内容查看当时的进程内存状态了。

2.3     使用gdb调试正在运行的进程

使用gdb调试正在运行的进程,首先我们需要知道程序的进程号,可使用如下指令

bjabmdev@linux5:/app/bjabmdev>ps -ef|grep TUXPAY

bjabmdev   528 15545  0 18:05 pts/38   00:00:00 tail -f TUXPAY_20170103.log

bjabmdev 12315 46164  0 18:54 pts/85   00:00:00 grep TUXPAY

bjabmdev 34400     1  0 09:34 ?        00:00:02 TUXPAY -C dom=bjabmdev -g 10 -i 1400 -u linux5 -U /app/bjabmdev/bin/ULOG -m 0 -A -r -- -l0 -L0 -cibas_acct/A47363616F537162696@ACTDB1 -s21 -b21 -S21 -B21

bjabmdev 48101 46624  0 13:58 pts/71   00:00:00 tail -500f TUXPAY_20170103.log

bjabmdev@linux5:/app/bjabmdev>

之后使用如下指令将我们的程序加入到调试中

bjabmdev@linux5:/app/bjabmdev>gdb -p 34400

GNU gdb (GDB) SUSE (7.5.1-0.7.29)

Copyright (C) 2012 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

接下来可以大家可以为所欲为啦;

调试完成后,退出调试有两种方法:a 直接退出进程b 仅退出调试

直接退出进程,直接在调试模式下执行quit指令,程序被杀死,自动退出

如果仅退出调试模式,则执行如下指令:

(gdb)detach

Detaching from program: /app/bjabmdev/bin/TUXPAY, process 34400

(gdb)  q

bjabmdev@linux5:/app/bjabmdev>

3       gdb调试过程中的常用指令

3.1     断点

l  break :在程序中设置断点,当程序运行到指定行上时,会暂停执行。使用格式:

break 要设置断点的行号

l  tbreak :设置临时断点,在设置之后只起作用一次。使用格式:

tbreak 要设置临时断点的行号

l  clear :和break相反,clear用于清除断点。使用格式:

clear 要清除的断点所在的行号

l  delete :清除断点或自动显示的表达式。使用格式:

delete 断点号

3.2     恢复程序运行指令

l  run :启动程序,在run后面带上参数可以传递给正在调试的程序。

l  * cont/continue :使程序在暂停在断点之后继续运行。使用格式:

cont

跳过当前断点继续运行。

cont n

跳过n次断点,继续运行。

n1时,cont 1即为cont

3.3     列出当前行附近的代码信息

l  list :显示程序中的代码,常用使用格式有:

    list

      输出从上次调用list命令开始往后的10行程序代码。

    list -

      输出从上次调用list命令开始往前的10行程序代码。

    list n

      输出第n行附近的10行程序代码。

    list function

      输出函数function前后的10行程序代码。

 

3.4     分步执行

l  next :继续执行语句,但是跳过子程序的调用。使用格式:

    next

      执行一条语句

    next n

      执行n条语句

l  nexti :单步执行语句,但和next不同的是,它会跟踪到子程序的内部,但不打印出子程序内部的语句。使用格式同上。

l  step :与next类似,但是它会跟踪到子程序的内部,而且会显示子程序内部的执行情况。使用格式同上。

l  stepi :与step类似,但是比step更详细,是nextistep的结合。使用格式同上。

 



TAG:

 

评分:0

我来说两句

Open Toolbar