一、启动调试 gdb <program> 启动程序进行调试 gdb ./bin/chat_server gdb --args ./bin/chat_server -c conf/cache_server.conf 在 UNIX 下用 ps 查看正在运行的程序的 PID (进程 ID), 然后用 gdb <program> PID 格式挂接正在运行的程序。 gdb attach <pid> 调试一个已经运行服务程序 gdb ./bin/ch...
在上面代码中,fork()函数创建的子进程内部,首先会进入while循环sleep,然后在while循环之后调用printf函数。这样做的目的有如下: 帮助attach捕获要调试的进程id 在使用gdb进行调试的时候,真正的代码(即print函数)没有被执行,这样就可以从头开始对子进程进行调试 ❝可能会有疑惑,上面代码以及进入while循环,无论如何是不...
command_list end 通常在断点处都是为了查看某些变量的值,如果能在断点处自动打印这些值,岂不爽歪歪?commands就是用来干这个的,省的你动手。如下示例 commands 1 slient printf “i is %d\n”, i end 在触发断点1时打印变量i的值,slient是让GDB安静的触发断点,不要打印一些没用的信息。 恢复执行: continue [...
打印变量的值,p为printf的缩写。 查看函数的堆栈信息 9.thread apply all bt,thread apply [编号…] [命令] thread apply all bt:让所有线程都打印堆栈信息。 thread apply ID command :让ID线程执行命令command。 thread apply all command :让所有线程执行命令command。 thread apply [编号…] [命令]:可以让...
CGDB是一款轻量级的基于GDB的命令行可视化工具,在终端窗口中以图形化的形式来调试代码,非常方便。相对于GDB来说,可以很大的提高效率 二:CGDB的安装 Linux-centos 检查机器上是否安装了 cgdb。 [root@hcss-ecs-a9ee ~]# cgdb --version-bash: cgdb: commandno...
在command命令后加断点编号,可以定义断点触发后想要执行的操作。在一些高级的自动化调试场景中可能会用到。 ❞ 命令行 程序栈 多进程、多线程多进程 GDB在调试多进程程序(程序含fork调用)时,默认只追踪父进程。可以通过命令设置,实现只追踪父进程或子进程,或者同时调试父进程和子进程。
#include<stdio.h>int nGlobalVar=;inttempFunction(int a,int b){printf("tempFunction is called, a = %d, b = %d \n",a,b);return(a+b);}intmain(){int n;n=;n++;n--;nGlobalVar+=;nGlobalVar-=;printf("n = %d, nGlobalVar = %d \n",n,nGlobalVar);n=tempFunction(,);printf...
(gdb) command& 其中,command 表示就是要执行的调试命令。command 和 & 之间不需要添加空格。 显然,通过在目标命令的后面添加一个 '&' 字符,即可使该命令以后台的方式执行。例如,continue 命令的异步执行版本为continue&或者c& 表1 罗列了支持后台执行的一些常用的调试命令: ...
printf("i = %d\n",i); } intmain{ bar(num); return0; } 如果你在没有 调试符号 (debugging sysbols) 的情况下进行编译(LCTT 译注:即在使用 gcc 编译程序时没有写 -g 选项),然后在 bar 上设置一个断点,然后尝试在这个函数内使用 step 来单步执行语句。GDB 会给出一个 没有行号信息 (no line ...
#include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h> #include <string.h> void* pthread_run1(void* arg) { (void)arg; while(1) { printf("I am thread1,ID: %d\n",pthread_self()); sleep(1); } } void* pthread_run2(void* arg) { (void)arg; whil...