摘要: 只允许一个线程运行 使用gdb调试多线程程序时,默认的调试模式为:一个线程暂停运行,其它线程也随即暂停;一个线程启动运行,其它线程也随即启动。要知道,这种调试机制确实能帮我们更好地监控各个线程的“一举一动”,但并非适用于所有场景。一些场景中,我们可能只想让某一特定线程运行,其它线程仍维持暂停状态。要 阅读全文
posted @ 2023-10-15 20:49 苏格拉底的落泪 阅读(398) 评论(0) 推荐(0) 编辑
摘要: 调试已经运行的进程 1.例子: #include <stdio.h> #include <pthread.h> void *thread_func(void *p_arg) { while (1) { printf("%s\n", (char *)p_arg); sleep(10); } } int 阅读全文
posted @ 2023-10-15 20:29 苏格拉底的落泪 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 调试子进程 默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的 分别以及同时 调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。 follow-for 阅读全文
posted @ 2023-10-15 20:26 苏格拉底的落泪 阅读(117) 评论(0) 推荐(0) 编辑
摘要: 打印内存的值 1. 例子 #include <stdio.h> int main(void) { int i = 0; char a[100]; for (i = 0; i < sizeof(a); i++) { a[i] = i; } return 0; } gdb中使用“x”命令来打印内存的值, 阅读全文
posted @ 2023-10-15 19:18 苏格拉底的落泪 阅读(409) 评论(0) 推荐(0) 编辑
摘要: 让catchpoint只触发一次 1. 例子: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(void) { pid_t pid; int i = 0; for ( 阅读全文
posted @ 2023-10-15 19:08 苏格拉底的落泪 阅读(8) 评论(0) 推荐(0) 编辑
摘要: 进入和退出图形化调试界面 1. 例子 #include <stdio.h> void fun1(void) { int i = 0; i++; i = i * 2; printf("%d\n", i); } void fun2(void) { int j = 0; fun1(); j++; j = 阅读全文
posted @ 2023-10-15 19:00 苏格拉底的落泪 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 打印数组的索引下标 1. 例子 #include <stdio.h> int num[10] = { 1 << 0, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, 1 << 8, 1 << 9 }; int main (void) { 阅读全文
posted @ 2023-10-15 18:39 苏格拉底的落泪 阅读(40) 评论(0) 推荐(0) 编辑
摘要: 打印数组中任意连续元素 1. 例子 #include <stdio.h> int main(void) { int array[201]; int i; for (i = 0; i < 201; i++) array[i] = i; return 0; } 在gdb中,如果要打印数组中任意连续元素的 阅读全文
posted @ 2023-10-15 18:35 苏格拉底的落泪 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 打印ASCII和宽字符字符串 1. 例子: #include <stdio.h> #include <wchar.h> int main(void) { char str1[] = "abcd"; wchar_t str2[] = L"abcd"; return 0; } 用gdb调试程序时,可以使 阅读全文
posted @ 2023-10-15 18:28 苏格拉底的落泪 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 设置观察点 1. 例子: #include <stdio.h> #include <pthread.h> typedef struct { int a; int b; int c; int d; pthread_mutex_t mutex; } ex_st; int main(void) { ex_ 阅读全文
posted @ 2023-10-15 15:38 苏格拉底的落泪 阅读(13) 评论(0) 推荐(0) 编辑
摘要: run和start区别 gdb调试器提供了多种方式来启动目标程序,其中最常用的就是 run 指令,其次为 start 指令。也就是说,run 和 start 指令都可以用来在gdb调试器中启动程序,它们之间的区别是: 1、默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点 阅读全文
posted @ 2023-10-15 12:22 苏格拉底的落泪 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 断点管理 命令说明: 命令 说明 break 断点命令 break 函数名 为函数设置断点 break 代码函数 为某一行设置断点 break 类名:函数名 在某个类的函数设置断点 break 文件名:函数名 在文件名指定某个函数设置断点 break 文件名:行数 在文件名执行的代码行设置断点 br 阅读全文
posted @ 2023-10-15 11:14 苏格拉底的落泪 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 向上或向下切换函数堆栈帧 1. 例子: #include <stdio.h> int func1(int a) { return 2 * a; } int func2(int a) { int c = 0; c = 2 * func1(a); return c; } int func3(int a) 阅读全文
posted @ 2023-10-15 10:47 苏格拉底的落泪 阅读(137) 评论(0) 推荐(0) 编辑