原创 初学GDB

2008-5-27 19:47 2918 8 8 分类: 软件与OS

初次尝试GDB(原创)
今天在一个老哥的博客看到了一篇Linux环境下C语言调试的文章,就自己学着弄了一弄:学会了很多东西但是,也发现了一些问题,
源程序是这样的(请原谅我没有把其中的错误改过来 只是直接复制的)
#i nclude 


main ()
{
 char my_string[] = "hello there";


 my_print (my_string);a
 my_print2 (my_string);
}


void my_print (char *string)
{
 printf ("The string is s\n", string);
}


void my_print2 (char *string)
{
 char *string2;
 int size, i;


 size = strlen (string);
 string2 = (char *) malloc (size + 1);
 for (i = 0; i < size; i++)
  string2[size - i] = string;
 string2[size+1] = `\0";
 printf ("The string printed backward is s\n", string2);
}


在用GDB调试的时候,用list命令的时候,出现了如下问题:
...init.c:No such file or directory. in init.c
经历了苦苦的搜寻
最后终于在另一位高手的博客里面找了答案
一般来说GDB主要调试c、c++。程序要调试C的程序首先在编译时必须要把调试信息加到可执行文件里面,使用编译器gcc的-g参数可以做到这一点,如:
  gcc -g hello -o hello.c
如果没有-g 选项调试信息加入之后并成功编译之后,进入GDB环境。
DB概述
————


GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。


一般来说,GDB主要帮忙你完成下面四个方面的功能:


1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。


从上面看来,GDB和一般的调试工具没有什么两样,基本上也是完成这些功能,不过在细节上,你会发现GDB这个调试工具的强大,大家可能比较习惯了图形化的调试工具,但有时候,命令行的调试工具却有着图形化工具所不能完成的功能。让我们一一看来。
db的命令很多,gdb把之分成许多个种类。help命令只是例出gdb的命令种类,如果要看种类中的命令,可以使用help 命令,如:help breakpoints,查看设置断点的所有命令。也可以直接help 来查看命令的帮助。



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就行了。
经过改正终于调通的程序了
呵呵 第一次写原创的博文。各位见笑见笑。

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条