C++常用GDB命令

目前项目使用的:

find ./ -name "InfoCheckStat"

 

ps -ef|grep 

workordercon

 

ps -ef|grep ctpclient

export PROCESS_ID=1003

gdb  

format

workordergen

 set args -y -t 3 -n 100000 -i F82 -s ext

 

 

export PROCESS_ID=1201

gdb  

bussevent

 set args 

-a

 

(gdb) b main

(gdb) r  (+ 参数

 

find ./ -name "settlefeefreeze"

settlefeefreeze

参考资料:http://blog.csdn.net/jubincn/article/details/6774524

源代码:

为了使读者更快地学习gdb,本文提供了一个带有bug的示例程序,以及一个简单的makefile,我把他们打包上传到这里,不需积分即可下载。在学习本文到过程中,读者可以通过调试这个示例程序来获得更好的体验。

这个示例程序很简单,包含两个类:Node和LinkedList。为了方便调试,我们将这两个类放到一个文件中。

前期准备

环境设置

首先检查是否安装gdb。如果您的系统中有g++,那么gdb就已经安装了。可以通过在命令行中输入gdb -v来检查是否安装gdb。

Debugging Symbols

gdb只能使用g++产生的symbol进行调试。如果读者使用Sun Cc编译器,那么可以使用一个和gdb很类似到调试工具:dbx
在调试带有debugging symbol的程序时,gdb才能如鱼得水。使用g++的-g选项,即可编译出带有gdb的debugging symbol的程序。除-g选项外,还可以使用-ggdb选项,本文的makefile里面即使用了-ggdb选项。

使用GDB调试

编译程序

首先,切换到含有前面下载的两个文件的目录,然后使用make命令进行编译。
make -f makefile
编译完成后,会生成一个名为main的可执行文件。

加载程序

使用gdb main命令即可将main可执行文件加载到gdb中。在我的终端,使用这个命令的结果如下:
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/jubin/Downloads/gdb_sample/main...done.
(gdb)
(注:在emacs中,您可以使用M-x gdb来在emacs中使用gdb。Emacs将分成两个窗口,第二个窗口将显示代码,并有个箭头指向正在执行的指令所在的代码行。)

gdb启动后,此时正在等待用户输入下一个指令。因为需要查看程序错在哪里,所以首先需要运行这个程序,输入run命令:
(gdb) run
Starting program: /home/jubin/Downloads/gdb_sample/main
Creating Node, 1 are in existence right now
Creating Node, 2 are in existence right now
Creating Node, 3 are in existence right now
Creating Node, 4 are in existence right now
The fully created list is:
4
3
2
1
Now removing elements:
Creating Node, 5 are in existence right now
Destroying Node, 4 are in existence right now
4
3
2
1
Program received signal SIGSEGV, Segmentation fault.
0x08048cb4 in Node<int>::next (this=0x0) at main.cc:30
30Node<T>* next () const { return next_; }
(gdb)
显然,这段程序出错了,下面我们来分析下错误出在什么地方。

检查出错信息

从上面的出错信息可以看出在main.cc的第30行,this指针指向了0。但同时我们还想知道谁调用了第30行,以及调用程序的当时状态。在gdb提示符中输入:backtrace
(gdb) backtrace
#0  0x08048cb4 in Node<int>::next (this=0x0) at main.cc:30
#1  0x08048bea in LinkedList<int>::remove (this=0x804c008, [email protected]) at main.cc:79
#2  0x080488d6 in main (argc=1, argv=0xbffff3a4) at main.cc:122
(gdb)
从上面的信息不仅可以看到出错的方法和局部变量,还可以找到调用第30行的程序以及调用时使用的参数item_to_remove的存储地址。x命令可以使我们根据item_to_remove的地址获得item_to_remove的值:
(gdb) x 0xbffff2c4
0xbffff2c4:0x00000001
(gdb)

从上面的信息可以看出,当使用参数“1”调用LinkedList<int>::remove时,程序出错。

条件断点

现在我们知道哪里出错了,下一步要做的是查看在出错前程序的状态。一种方法是步进,直到快出错的那个位置,另一种就是设置断点,在gdb中这样实现:

(gdb) break LinkedList<int>::remove

Breakpoint 1 at 0x8048ab3: file main.cc, line 54.

(gdb)

这样位于 LinkedList<int>::remove的断点“1”就设置好了。如果我们只想查看item_to_remove == 1时的状态,那么需要使用条件断点,在gdb中输入:

(gdb) condition 1 item_to_remove == 1
(gdb)
这个命令的意思是只有在“item_to_remove == 1”的情况下,断点“1”才会生效。

步进

gdb中步进的命令是step。gdb有一个很好的特性,当用户只输入回车时默认执行上一个命令,因此步进时只需在第一步输入step,后面直接敲击回车就可以了。
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/jubin/Downloads/gdb_sample/main
Creating Node, 1 are in existence right now
Creating Node, 2 are in existence right now
Creating Node, 3 are in existence right now
Creating Node, 4 are in existence right now
The fully created list is:
4
3
2
1

Now removing elements:
Creating Node, 5 are in existence right now
Destroying Node, 4 are in existence right now
4
3
2
1

Breakpoint 1, LinkedList<int>::remove (this=0x804c008, [email protected])
   at main.cc:54
54   Node<T> *marker = head_;
(gdb) step
55   Node<T> *temp = 0;  // temp points to one behind as we iterate
(gdb)
57   while (marker != 0) {
(gdb)
58     if (marker->value() == item_to_remove) {
(gdb)
Node<int>::value (this=0x804c058) at main.cc:32
32 const T& value () const { return value_; }
(gdb)
LinkedList<int>::remove (this=0x804c008, [email protected]) at main.cc:77
77     marker = 0;  // reset the marker
(gdb)
78     temp = marker;
(gdb)
79     marker = marker->next();
(gdb)
Node<int>::next (this=0x0) at main.cc:30
30 Node<T>* next () const { return next_; }
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x08048cb4 in Node<int>::next (this=0x0) at main.cc:30
30 Node<T>* next () const { return next_; }
(gdb)
离开gdb的命令:q或quit

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

通过上面的内容,相信您已经可以充满自信地使用gdb了,下面将补充一些常用的gdb命令:

continue or c (continue的简写) :程序中断后继续运行

next:程序中断后不进入函数,与step对应

info break:查看断点

disable break <断点号>,如disable break 1:使<断点号>号断点失效

delete break <断点号>:删除<断点号>号断点

list:列出代码行,一般是10行

clear <断点句>:与break对应,后面的内容就是创建断点时break后面的内容,清楚某断点

breakpoint or b:创建断点,有两种用法。

b <函数名>:设置函数断点

b <文件名:行号>:在某文件的某行设置断点

 

时间: 2024-11-05 14:57:48

C++常用GDB命令的相关文章

常用 GDB 命令中文速览

转自:https://linux.cn/article-8900-1.html?utm_source=index&utm_medium=moremore 目录 break -- 在指定的行或函数处设置断点,缩写为 b info breakpoints -- 打印未删除的所有断点,观察点和捕获点的列表,缩写为 i b disable -- 禁用断点,缩写为 dis enable -- 启用断点 clear -- 清除指定行或函数处的断点 delete -- 删除断点,缩写为 d tbreak --

GDB常用调试命令

在程序编译时增加-g选项以支持gdb调试 如: $ gcc -g example.c -o example.x 通过上述命令对example.c编译之后,使用下列命令进入到gdb调试: $ gdb example.x 在gdb调试中,常用的命令有以下几个: $ list 缩略为 l 列出程序源码,每次列出10行,按回车重复运行上一命令: $ run 缩略为 r 程序开始运行,在r后可以加入程序启动参数,程序运行到断点处暂停: $ continue 缩略为 c 程序继续运行,到下一断点处暂停: 单

自己常用GDB调试命令

1.进入gdb调试模式 $ gdb xxx(程序名) 设置函数参数:set args  xxx 查看函数参数:show args 2.break 行号 (打断点) 3.delete 行号 (取消断点) 4.next 单步运行 5.step 进入函数内部 6.finish 退出当前函数 7.print 变量名/*(指针)   :查看变量的运行中的值 9.continue 继续执行 9.退出调试模式 signal SIGINT /  强行退出 signal SIGKILL 10.2次Tab 可补全命

GDB调试&mdash;&mdash;常用的命令

首先说明一点,如果我们要使用GDB来调试我们的C/C++程序时,在使用GCC编译程序时,应该带上 –g 参数, 它负责生成 与GDB相关的调试信息: 1.如何对一个文件启动GDB调试? 方法一: 命令行输入:  gdb filename 方法二: 命令行输入: gdb                 , 进行gdb工作界面以后,再输入命令: file filename             ,其中file为gdb的一个命令: 2. 常见的GDB命令: 命令 解释 示例 file <文件名>

GDB命令行最基本操作

程序启动: A.冷启动 gdb program              e.g., gdb ./cs gdb –p pid                 e.g., gdb –p `pidof cs` gdb program core      e.g., gdb ./cs core.xxx B.热启动 (gdb) attach pid        e.g., (gdb) attach 2313 C.传入命令行参数 gdb program --args arglist (gdb) set

Xcode GDB 命令list

此文下半部分为转载:但是这里有一些我自己使用技巧,结合下面的文章,我们会有更多的收获,在此感谢原创者.     --------------------- 关于调试异常崩溃: 一般崩溃是由内存使用错误导致的,要么多了,要么少了. 用xcode的调试提示可以知道是什么原因导致的崩溃. 在xcode中product àedit scheme à diagnostics 将enable Zombie objects 和 Malloc Stack 选中, 如果是内存释放错误,则gdb会提示release

(转)GDB命令行最基本操作

程序启动: A.冷启动 gdb program              e.g., gdb ./cs gdb –p pid                 e.g., gdb –p `pidof cs` gdb program core      e.g., gdb ./cs core.xxx B.热启动 (gdb) attach pid        e.g., (gdb) attach 2313 C.传入命令行参数 gdb program --args arglist (gdb) set

01. Shell基础和使用技巧(工具+常用bash命令加速操作)

Shell脚本介绍和常用工具 Shell脚本 Shell脚本:实际就是windows里的批处理脚本,多条可一次执行的Shell命令集合.Linux上的脚本可以用很多种语言实现,bash shell是比较简单的一种,更高阶的可以用其他脚本语言,比如Python. Shell脚本对系统的管理能力非常强大,甚至可以使用Shell结合php实现Web管理Linux系统功能:可以自己写一个Web页面(示例:基于Php),对系统进行管理,包括查看删除用户,配置网络,发送邮件,重启系统,一键备份,一键搭建服务

Linux服务器开发常用的命令以及遇到的问题

1. 什么是linux服务器load average? Load是用来度量服务器工作量的大小,即计算机cpu任务执行队列的长度,值越大,表明包括正在运行和待运行的进程数越多.参考资料:http://en.wikipedia.org/wiki/Load_average 2. 如何查看linux服务器负载 可以通过w,top,uptime,procinfo命令,也可以通过/proc/loadavg文件查看. 3. 服务器负载高怎么办? 服务器负载(load/load average)是根据进程队列的