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>
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

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

GDB调试实战(10)多线程调试

GDB 跳过共享库断点

我可以在 GDB 中的“内存访问”上设置断点吗?

GDB使用小记

Go语言-gdb调试

gdb:无法设置断点:“没有加载符号表。使用“file”命令。“