概述
浅谈linux环境下C++程序调试
1认识gdb
象所有的调试器一样,GDB可以让你调试一个程序,包括让程序在你希望的地方停下,此时你可以查看变量,寄存器,内存及堆栈。更进一步你可以修改变量及内存值。
GDB是一个功能很强大的调试器,它可以调试多种语言。在此我们仅涉及C和C++的调试,而不包括其它语言。
还有一点要说明的是,GDB是一个调试器,而不象VC一样是一个集成环境。
在你调试你的程序之前,当你编译你的源程序时,不要忘了-g选项或其它相应的选项,才能将调试信息加到你要调试的程序中。例如:gcc -g -o hello hello.c。
2gdb调试的几种方式
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
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:
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
进入调试状态后可以使用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
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>
3gdb调试过程中的常用指令
3.1断点
lbreak:在程序中设置断点,当程序运行到指定行上时,会暂停执行。使用格式:
break要设置断点的行号
ltbreak:设置临时断点,在设置之后只起作用一次。使用格式:
tbreak要设置临时断点的行号
lclear:和break相反,clear用于清除断点。使用格式:
clear要清除的断点所在的行号
ldelete:清除断点或自动显示的表达式。使用格式:
delete断点号
3.2恢复程序运行指令
lrun:启动程序,在run后面带上参数可以传递给正在调试的程序。
l* cont/continue:使程序在暂停在断点之后继续运行。使用格式:
cont
跳过当前断点继续运行。
cont
n
跳过n次断点,继续运行。
n为1时,cont 1即为cont。
3.3列出当前行附近的代码信息
llist:显示程序中的代码,常用使用格式有:
list
输出从上次调用list命令开始往后的10行程序代码。
list -
输出从上次调用list命令开始往前的10行程序代码。
list n
输出第n行附近的10行程序代码。
list function
输出函数function前后的10行程序代码。
3.4分步执行
lnext:继续执行语句,但是跳过子程序的调用。使用格式:
next
执行一条语句
next n
执行n条语句
lnexti:单步执行语句,但和next不同的是,它会跟踪到子程序的内部,但不打印出子程序内部的语句。使用格式同上。
lstep:与next类似,但是它会跟踪到子程序的内部,而且会显示子程序内部的执行情况。使用格式同上。
lstepi:与step类似,但是比step更详细,是nexti和step的结合。使用格式同上。
最后
以上就是追寻花卷为你收集整理的linux环境调试程序,linux环境下程序调试-gdb-1的全部内容,希望文章能够帮你解决linux环境调试程序,linux环境下程序调试-gdb-1所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复