宠物网站设计的代码,wordpress 翻译 每页,广东手机网站建设多少钱,搜狗搜索引擎优化指南目录
1.gdb介绍
2.设置断点
2.1.测试代码
2.2.设置函数断点
2.3.设置文件行号断点
2.4.设置条件断点
2.5.多线程调试
3.删除断点
3.1.删除指定断点
3.2.删除全部断点
4.查看变量信息
4.1.p命令
4.2.display命令
4.3.watch命令
5.coredump日志
6.总结 1.gdb介绍…目录
1.gdb介绍
2.设置断点
2.1.测试代码
2.2.设置函数断点
2.3.设置文件行号断点
2.4.设置条件断点
2.5.多线程调试
3.删除断点
3.1.删除指定断点
3.2.删除全部断点
4.查看变量信息
4.1.p命令
4.2.display命令
4.3.watch命令
5.coredump日志
6.总结 1.gdb介绍 gdb是一个强大的调试工具广泛用于调试 C、C 以及其他编程语言的程序。它帮助程序员在开发过程中识别并修复错误提高程序的可靠性和性能。 掌握gdb的基本使用方法非常重要它能够帮助我们快速定位一些段错误问题或者解决一些程序异常问题。 如果提示没有gdb命令需要手动安装一下gdb插件 在 Ubuntu/Debian 上安装 gdbsudo apt install gdb 在 CentOS/RHEL 上安装 gdbsudo yum install gdb 日常工作中可以选择gdb启动程序或者gdb -p 程序进程号来调试程序章节设置断点将会详细讲解。 2.设置断点
2.1.测试代码 先上一段测试代码方便讲解设置断点的方法
main.c文件
#include stdio.h
#include unistd.h
#include string.h
#include pthread.h#define THREAD_NUM 3
#define LOOP_NUM 10void *task(void *arg) {while (1) {int num *(int *)arg;printf(my num:%d\n, num);sleep(1);}
}void first_print(int num) {printf(first hello: %d\n, num);return;
}void second_print(int num) {printf(second hello: %d\n, num);return;
}void test_copy(char *dest, char *src) {memcpy(dest, src, strlen(src));
}int main()
{char *s NULL;char *p 123;//test_copy(s, p);for (int i 0; i 10; i) {first_print(i);second_print(i);}pthread_t threads[THREAD_NUM];int thread_arg[THREAD_NUM] {0};for (int i 0; i THREAD_NUM; i) {thread_arg[i] i;pthread_create(threads[i], NULL, task, thread_arg[i]);}for (int i 0; i THREAD_NUM; i) {pthread_join(threads[i], NULL);}return 0;
}makefile文件
test:main.cgcc -O0 -g -o test main.c -lpthread.PHONY:clean
clean:rm -rf test *.o 代码功能非常简单两个打印函数以及创建3个线程死循环打印。
2.2.设置函数断点 函数断点顾名思义断点设置在函数上操作命令: b 函数名 经过makefile编译后会产生一个test可执行文件通常来说我们直接gdb可执行文件即可即gdb test然后输入运行程序。 那么如何设置断点呢通常可以在执行命令之前设置断点或者运行过程中设置断点但是运行过程中设置断点你需要保证程序还没有运行到你将要设置的断点的位置否则不会命中断点。 下面我们设置两个函数断点first_print和second_print执行b first_print回车然后再执行b second_print即可。 通过 i b命令查看我们当前设置断点信息可以看到设置了两个断点编号分别为1 2 然后就可以执行 r 命令运行程序。 当我们运行程序后可以看到程序命中了第一个断点执行命令 作用是跳转到下一个断点执行 n 命令可以运行到一下行。 2.3.设置文件行号断点 gdb还可以针对文件的某一行设置断点操作命令b 文件名:行号 可以看到我们将断点设置在了main.c文件的第23行运行程序程序停止在了23行的位置。
2.4.设置条件断点 设置条件断点即再设置断点的基础之上再加上额外的条件例如某一个变量等于固定的数值操作命令b 函数 if (变量 常数) 可以看到我设置了一个断点在函数first_print且仅当num值为2时命中该断点运行程序和预期结果一致。
2.5.多线程调试 在程序中如果存在多线程的情况调试起来稍微复杂一些但是这种场景经常会出现在多核开发环境上因此需要掌握其调试方法。 那么如果设置一个断点到一个函数这个函数会被多个线程调用那么必定会发生线程切换因此调试时需要加锁命令set scheduler-locking on 可以看到将断点设置到了12行如果不加锁那么这三个线程都会触发这个断点当第一次触发时我们可以加锁使得只有当前线程能停在这个断点若要解锁 执行命令set scheduler-locking off。 可以看到解锁之后发送了线程切换。 还有一种方式就是查看当前运行的全部线程然后进入需要调试的线程。查看全部线程的命令info threads 可以看到有三个子线程然后可以通过thread 线程号 命令进入具体的线程。 3.删除断点
3.1.删除指定断点 删除指定断点操作命令d 断点编号 如图开始设置了两个断点其编号分别为1 和 2 执行命令d 1 删除断点1然后查看断点情况只剩下断点2同理如果要删除断点2执行命令d 2即可。
3.2.删除全部断点 删除全部断点操作命令d 4.查看变量信息 查看变量信息有多种命令每种命令有不同的作用。
4.1.p命令 主要用于查看变量的值操作命令:p 变量名 如图执行p num可以查看到num的值。
4.2.display命令 主要用于一直显示某个变量的值好处就是不用每次手动执行p命令来查看某个变量的值操作命令display 变量名 如果想取消一直显示首先执行display获取id然后执行命令undisplay id 即可 4.3.watch命令 watch命令可以追踪某个变量变化前的值和变化后的值操作命令watch 变量名 如果需要需要watch首先查看所有监视点info watchpoints然后执行删除命令删除指定watchdelete hw watchpoint 3 5.coredump日志 将测试代码第36行//test_copy(s, p);取消注释然后重新编译很明显程序会段错误此时我们可以执行ulimit -c unlimited使其可以生产coredump日志文件然后可以使用gdb调试命令定位问题操作命令gdb 可执行文件名 core文件名 使用bt命令可以看到具体的调用堆栈信息然后f id进入具体的函数通过p命令查看变量的值很明显dest为空指针。 6.总结 gdb是程序员调试程序不可获取的工具需要大家多多使用熟能生巧 。 注makefile如果加了-o3编译优化或者其他优化手段可能在运行时行号会发生跳跃和预期不一致。