gdb设置断点实战
Posted seasidezhb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdb设置断点实战相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
void printAllArguments(int argsInthis,char* argumentsInThis[]);
void printAllArgsFronSecond(int argsInSecondArguments,char* argumentsSecondArguments[]);
void printLeftArgumentsFromThird(int argsNumber,char* arguments[]);
int main(int args, char *argv[])
if(args==1)
printf("%s\\n",argv[args-1]);
printf("There is only one argument\\n");
else
int argIfArgsEqualTwo = args;
printf("There is more than one arguments\\n");
printAllArguments(args,argv);
return 0;
void printAllArguments(int argsInthis,char* argumentsInThis[])
int numberOne = 1;
printf("%s\\n",argumentsInThis[0]);
printAllArgsFronSecond(argsInthis,argumentsInThis);
void printAllArgsFronSecond(int argsInSecondArguments,char* argumentsSecondArguments[])
int number2 = 2;
printf("%s\\n",argumentsSecondArguments[1]);
printLeftArgumentsFromThird(argsInSecondArguments,argumentsSecondArguments);
上边的代码用编辑器保存成printArgumentsTwo.c
。
#include<stdio.h>
void printLeftArgumentsFromThird(int argsNumber,char* arguments[])
int number3 = 4;
for(int beginNumber = 2;beginNumber<argsNumber;beginNumber++)
printf("%s\\n",arguments[beginNumber]);
上边的代码使用编辑器保存成printArgumentsFromThird.c
。
gcc -c -g -gdwarf-4 printArgumentsTwo.c -o printArgumentsTwo.o
进行编译。
gcc -c -g -gdwarf-4 printArgumentsFromThird.c -o printArgumentsFromThird.o
进行编译。
gcc -g -gdwarf-4 printArgumentsFromThird.o printArgumentsTwo.o -o printAllArgumentsTwoFile
进行链接。
gdb -q printAllArgumentsTwoFile
进入到gdb调试里边。
break开头的命令有以下五种形式:
1.break 行号
,让程序在执行给定代码行前停止。
2.break 函数名
,让程序在进入指定函数前停止。
3.break 行号或者函数名 if 条件
,符合条件时,在指定代码行或者指定函数前停止。
4.break 文件名:行号
,在指定的文件行号前停止。
5.break 文件名:函数名
,在指定的文件函数前停止。
break 10
break printAllArguments
break 19 if argsInthis==4
break printAllArgsFronSecond if argsInSecondArguments==4
break printArgumentsFromThird.c:printLeftArgumentsFromThird
break printArgumentsFromThird.c:5
对应上边的五种设置断点的方法设置六处断点,这六处断点按照执行顺序设置,使用continue
或者c
依次执行这六处断点。
info break
查看设置的断点。
run 1 2 3
开始调试。
上图是停在第一个断点处,print args
可以看一下变量args的值,print argIfArgsEqualTwo
可以看一下argIfArgsEqualTwo的值。
现在args与argIfArgsEqualTwo的值不同,说明,程序会停在断点所在行之前。
continue
运行之后,停在了第二个断点。
没有表达式的话,程序不会停止,printAllArguments
是一个函数而程序停止在函数名下边的那行“int numberOne = 1;”前。
c
进行运行之后,停留在第三个断点处。
使用info break可以显示设置断点,但是这次可以发现,
breakpoint already hit 1 time
这样的字样,这是说明,已经经过一次这样的断点了。
再连续按下c
就可以执行完成程序。
此文章为3月Day 28学习笔记,内容来源于极客时间《操作系统实战 45 讲》。
GDB调试实战(10)多线程调试
使用gdb调试多线程时,和调试单线程时类似,但是需要附加使用几个命令来协助进行线程切换。
a-首先是使用info threads查看当前有哪些线程,当前所在线程。
b-然后使用threads id切换到其它线程。
c-最后用thread apply id|all command 来把命令在某线程或所有线程下执行,这里的command就是你平常敲的gdb命令。例如,你是否遇到过在线程里设置断点,程序停住之后,你试图按下n单步运行,你会发现运行的下一步并非是本线程断点的下一条语句,有点找不到北。其实应该执行thread apply id n
, id替换成通过thread id查看到的id。
d-线程来回切换比较麻烦,我们可以锁定只执行某个线程:
只运行当前线程:set scheduler-locking on
取消锁定:set scheduler-locking off
来个实例实战下。
#include <pthread.h>
#include <stdio.h>


以上是关于gdb设置断点实战的主要内容,如果未能解决你的问题,请参考以下文章