首页 > 编程知识 正文

gdb调试查看变量值的命令(linux下gdb调试bt指令)

时间:2023-05-05 04:22:52 阅读:68408 作者:4571

GDB调试器1gdb概述————

GDB是GNU开源组织发布的强大的UNIX下的程序调试工具。 也许大家都喜欢像调试VC、BCB等IDE这样的图形接口方式,但是在UNIX平台下制作软件的话,GDB这个调试工具就是VC、BCB的图形调试哦“有优点,尺短”是这个理由。

一般来说,GDB主要有助于完成以下四个功能:

1、可以启动你的程序,按照你定制的要求随心所欲地运行程序。 2 .可以使调试后的程序在指定的调试点停止。 【断点可以是条件式】3、程序停止时,可以检查此时在你的程序中发生的事情。 4、动态改变你程序的执行环境。 从上面看,GDB与常见的调试工具没有区别,基本上是完成这些功能。 但是,在细节上,您可以看到名为GDB的调试工具的强度。 虽然您可能已经熟悉图形化调试工具,但命令行上的调试工具可能有图形工具无法提供的功能。 让我们逐一看看。

调试示例——————

//源程序: tst.c# include stdio.hint func (intn ) { int sum=0,I; for(I=0; in; I ) { sum=i; } return sum; }main () { int i; 长结果=0; for(I=1; i=100; I ) { result =i; }printf('result[1-100]=%d/n ',result ); printf(result[1-250]=%d/n )、func ) 250 ); }编译生成可执行文件: ((Linux下) ) ) ) ) ) ) ) )。

# gcc -g tst.c -o tst使用GDB调试:

# gdbtstgnugdb5.1. 1版权2002 freesoftware foundation,Inc.GDB is free software,coveredbythegnugeneralpubliclicense, 与you are welcome to change it and/ordistributecopiesofitundercertainconditions.type ' show copying ' toseetheconditions.thereisabsolutelynowarrrantyforgdb.tttyforatb rrrantyforgdb.nty ' for details.thisgdbwasconfiguredas ' i386-SuSE-Linux '---- gdb (l------------ l ) 6for(I=0; in; I )7 {8 sum=i; 9 } 10返回和; (gdb ) ) (15 ) 16inti )表示直接返回车辆,重复上一次命令11 ) 121314main )。 17长结果=0; 18for(I=1; i=100; I ) 19 {20 result =i; (gdb ) break16---------在源程序的第16行设置断点。 breakpoint1at0x 80484963360 filetst.c,line16.(gdb ) breakfunc---------函数func ) ) -在入口设置断点breakpoint2at 006 numtypedispenbaddresswhat1breakpoint keepy0x 08048496 inmainattst.c :162 breakpoint keepy0x 08048456 infuncattst.c 3:5 (gdb

test/tstBreakpoint 1, main () at tst.c:17 <---------- 在断点处停住。17 long result = 0;(gdb) n <--------------------- 单条语句执行,next命令简写。18 for(i=1; i<=100; i++)(gdb) n20 result += i;(gdb) n18 for(i=1; i<=100; i++)(gdb) n20 result += i;(gdb) c <--------------------- 继续运行程序,continue命令简写。Continuing.result[1-100] = 5050 <----------程序输出。Breakpoint 2, func (n=250) at tst.c:55 int sum=0,i;(gdb) n6 for(i=1; i<=n; i++)(gdb) p i <--------------------- 打印变量i的值,print命令简写。$1 = 134513808(gdb) n8 sum+=i;(gdb) n6 for(i=1; i<=n; i++)(gdb) p sum$2 = 1(gdb) n8 sum+=i;(gdb) p i$3 = 2(gdb) n6 for(i=1; i<=n; i++)(gdb) p sum$4 = 3(gdb) bt <--------------------- 查看函数堆栈。#0 func (n=250) at tst.c:5#1 0x080484e4 in main () at tst.c:24#2 0x400409ed in __libc_start_main () from /lib/libc.so.6(gdb) finish <--------------------- 退出函数。Run till exit from #0 func (n=250) at tst.c:50x080484e4 in main () at tst.c:2424 printf("result[1-250] = %d /n", func(250) );Value returned is $6 = 31375(gdb) c <--------------------- 继续运行。Continuing.result[1-250] = 31375 <----------程序输出。Program exited with code 027. <--------程序退出,调试结束。(gdb) q <--------------------- 退出gdb。yr/test>

好了,有了以上的感性认识,还是让我们来系统地认识一下gdb吧。

使用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所定义的路径。

原文网址 谢谢原博主,转载自此,为方便自己查看学习,无抄袭动机。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。