Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: 它使你能监视你程序中变量的值. 它使你能设置断点以使程序在指定的代码行上停止执行. 它使你能一行行的执行你的代码. 在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常的话, gdb 将被启动并且你将在屏幕上看到类似的内容:
当你启动 gdb 后, 你能在命令行上指定很多的选项. 你也可以以下面的方式来运行 gdb : gdb 当你用这种方式运行 gdb , 你能直接指定想要调试的程序. 这将告诉gdb 装入名为 fname 的可执行文件. 你也可以用 gdb 去检查一个因程序异常终止而产生的 core 文件, 或者与一个正在运行的程序相连. 你可以参考 gdb 指南页或在命令行上键入 gdb -h 得到一个有关这些选项的说明的简单列表. 为调试编译代码(Compiling Code for Debugging) 为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号. gdb 利用这些信息使源代码和机器码相关联. 在编译时用 -g 选项打开调试选项. gdb 基本命令 gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表1列出了你在用 gdb 调试时会用到的一些命令. 表1. 基本 gdb 命令.
gdb 支持很多与 UNIX shell 程序一样的命令编辑特征. 你能象在 bash 或 tcsh里那样按 Tab 键让 gdb 帮你补齐一个惟一的命令, 如果不惟一的话 gdb 会列出所有匹配的命令. 你也能用光标键上下翻动历史命令. |
#include <stdio.h>main (){ char my_string[] = "hello there"; my_print (my_string); 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) runStarting program: /root/greetingThe string is hello thereThe string printed backward isProgram exited with code 041 |
1 #include <stdio.h>23 main ()4 {5 char my_string[] = "hello there";67 my_print (my_string);8 my_print2 (my_string);9 }10 |
11 my_print (char *string)12 {13 printf ("The string is %s/n", string);14 }1516 my_print2 (char *string)17 {18 char *string2;19 int size, i;20 |
21 size = strlen (string);22 string2 = (char *) malloc (size + 1);23 for (i = 0; i < size; i++)24 string2[size - i] = string;25 string2[size+1] = `/0';26 printf ("The string printed backward is %s/n", string2);27 } |
Starting program: /root/greetingThe string is hello thereBreakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.c :2424 string2[size-i]=string |
Watchpoint 2, string2[size - i]Old value = 0 `/000'New value = 104 `h'my_print2(string = 0xbfffdc4 "hello there") at greeting.c:2323 for (i=0; i<size; i++) |
#include <stdio.h>main (){ char my_string[] = "hello there"; my_print (my_string); my_print2 (my_string);}my_print (char *string){ printf ("The string is %s/n", string);}my_print2 (char *string){ char *string2; int size, size2, i; size = strlen (string); size2 = size -1; string2 = (char *) malloc (size + 1); for (i = 0; i < size; i++) string2[size2 - i] = string; string2[size] = `/0'; printf ("The string printed backward is %s/n", string2);} |
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) | Powered by Discuz! X3.4 |