目录
-
gdb简介
UNIX及UNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具相比于VC、z的优点是具有修复网络断点以及恢复链接等功能,比BCB的图形化调试器有更强大的功能。所谓“尺有所短,寸有所长”就是这个道理。
-
主要功能
一般来说,GDB主要帮助你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
-
gdb的基本使用命令
命令 | 命令缩写 | 命令说明 |
list | l | 显示多行源代码 |
break | b | 设置断点,程序运行到断点的位置会停下来 |
info | i | 描述程序的状态 |
run | r | 开始运行程序 |
display | disp | 跟踪查看某个变量,每次停下来都显示它的值 |
step | s | 执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句 |
next | n | 执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句) |
| p | 打印内部变量值 |
continue | c | 继续程序的运行,直到遇到下一个断点 |
set var name=v |
| 设置变量的值 |
start | st | 开始执行程序,在main函数的第一条语句前面停下来 |
file |
| 装入需要调试的程序 |
kill | k | 终止正在调试的程序 |
watch |
| 监视变量值的变化 |
backtrace | bt | 产看函数调用信息(堆栈) |
frame | f | 查看栈帧 |
quit | q | 退出GDB环境 |
-
gdb的主要使用方式
- 先要对需要调试的代码进行gcc -g 的编译
gcc -g test_gdb.c -o test_gdb
- 使用gdb调试错误代码
gdb ./test_gdb
-
设置断点运行程序并用print打印所要跟踪的变量的值
break 12 //在十二行设置断点 b main //在main函数处设置断点 r (run) //运行程序 print var_naem // 打印var_naem的值 c(continue) //到断点处打印完调试信息继续运行,直到遇到下一个断点 s(step) //执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句 n(next) //执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)
-
总结
这道题目的错误和我们刚刚开始写swap函数一样,因为函数传参只是简单的值传递,所以我们在调用getmemory()函数之后,ptr的确是被分配到了内存空间,但是在离开getmemory函数之后,getmemory()函数分配的那段内存空间就失效了,所以ptr还是为空,即在test()函数中进行strcpy()时因为ptr为空,所以出现了段错误。更正也比较简单,可以使用传地址或是使用返回值的形式进行函数调用。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void get_memroy(char ** ptr, int size);
char* get_memroy1(char * ptr, int size);
void test01();
int main(int argc, char *argv[])
{
test01();
return 0;
}
void get_memroy(char ** ptr, int size)
{
*ptr = malloc(size);
}
char* get_memroy1(char * ptr, int size)
{
ptr = malloc(size);
return ptr;
}
void test01()
{
char* ptr = NULL;
ptr = get_memroy1(ptr, 100);
strcpy(ptr, "Hello Word\n");
printf("%s", ptr);
free(ptr);
}