皮皮网
皮皮网

【php源码分析框】【canvas 设计 源码】【nba软件源码】gdb breakpoint源码

来源:淘宝装修模板源码 发表时间:2024-11-30 13:24:17

1.gdb--设置断点的方法
2.gdb命令中attach使用
3.盘点Linux内核debug绝招之一:GDB调试器

gdb breakpoint源码

gdb--设置断点的方法

       在GDB调试器中,设置断点是进行程序分析的重要步骤。主要有以下几种方法:

       1. 通过文件和行号定位:直接使用命令(gdb) b xxx.cpp:,如果遇到多个同名源文件,且位于不同文件夹中,如来自'folder',php源码分析框则指定完整路径,如(gdb) b folder/xxx.cpp:。

       2. 根据函数名设置断点:这种方法适合于明确知道函数位置的情况,输入格式为(gdb) b xxx.cpp:ClassName::FunctionName,注意,函数名和类名之间需要使用一个冒号(:)而非两个(::)。

       3. 查看和利用虚函数表:当需要在对象的虚函数上设置断点时,首先要获取对象的指针,如使用变量$3。接着,通过命令(gdb) info vtbl $3,查看该对象的虚函数表,从而定位到相应的函数。

       以上是GDB设置断点的基本步骤,根据具体需求灵活运用,canvas 设计 源码能有效帮助开发者定位和理解代码执行过程。

gdb命令中attach使用

       我们先看看我们的测试程序:

       /* in eg1.c */

       int wib(int no1, int no2)

       {

       int result, diff;

       diff = no1 - no2;

       result = no1 / diff;

       return result;

       }

       int main()

       {

       pid_t pid;

       pid = fork();

       if (pid <0) {

       printf("fork err\n");

       exit(-1);

       } else if (pid == 0) {

       /* in child process */

       sleep(); ------------------ (!)

       int value = ;

       int div = 6;

       int total = 0;

       int i = 0;

       int result = 0;

       for (i = 0; i < ; i++) {

       result = wib(value, div);

       total += result;

       div++

       value--;

       }

       printf("%d wibed by %d equals %d\n" value, div, total);

       exit(0);

       } else {

       /* in parent process */

       sleep(4);

       wait(-1);

       exit(0);

       }

       }

       该测试程序中子进程运行过程中会在wib函数中出现一个‘除0‘异常。现在我们就要调试该子进程。

       [调试原理]

       不知道大家发现没有,在(!)处在我们的测试程序在父进程fork后,子进程调用sleep睡了秒。这就是关键,这个sleep本来是不该存在于子进程代码中的,而是而了使用GDB调试后加入的,它是nba软件源码我们调试的一个关键点。为什么要让子进程刚刚运行就开始sleep呢?因为我们要在子进程睡眠期间,利用 shell命令获取其process id,然后再利用gdb调试外部进程的方法attach到该process id上,调试该进程。

       [调试过程]

       我觉上面的调试原理的思路已经很清晰了,剩下的就是如何操作的问题了。我们来实践一次吧!

       我所使用的环境是Solaris OS 9.0/GCC 3.2/GDB 6.1。

       GDB 调试程序的前提条件就是你编译程序时必须加入调试符号信息,即使用‘-g‘编译选项。趋势导航源码首先编译我们的源程序‘gcc -g -o eg1 eg1.c‘。编译好之后,我们就有了我们的调试目标eg1。由于我们在调试过程中需要多个工具配合,所以你最好多打开几个终端窗口,另外一点需要注意的是最好在eg1的working directory下执行gdb程序,否则gdb回提示‘No symbol table is loaded‘。你还得手工load symbol table。好了,下面我们就‘按部就班‘的谷歌zxing源码开始调试我们的eg1。

       执行eg1:

       eg1 & --- 让eg1后台运行吧。

       查找进程id:

       ps -fu YOUR_USER_NAME

       运行gdb:

       gdb

       (gdb)attach xxxxx--- xxxxx为利用ps命令获得的子进程process id

       (gdb)stop--- 这点很重要,你需要先暂停那个子进程,然后设置一些断点和一些Watch

       (gdb)break-- 在result = wib(value, div);这行设置一个断点,可以使用list命令察看源代码

       Breakpoint 1 at 0x: file eg1.c, line .

       (gdb)continue

       Continuing.

       Breakpoint 1, main () at eg1.c:

        result = wib(value, div);

       (gdb)step

       wib (no1=, no2=6) at eg1.c:

        diff = no1 - no2;

       (gdb)continue

       Continuing.

       Breakpoint 1, main () at eg1.c:

        result = wib(value, div);

       (gdb)step

       wib (no1=9, no2=7) at eg1.c:

        diff = no1 - no2;

       (gdb)continue

       Continuing.

       Breakpoint 1, main () at eg1.c:

        result = wib(value, div);

       (gdb)step

       wib (no1=8, no2=8) at eg1.c:

        diff = no1 - no2;

       (gdb)next

        result = no1 / diff;

       (gdb)print diff

       $6 = 0 ------- 除数为0,我们找到罪魁祸首了。

       (gdb)next

       Program received signal SIGFPE, Arithmetic exception.

       0xffd in .div () from /usr/lib/libc.so.1

       至此,我们调试完毕。

       gdb命令中attach使用

盘点Linux内核debug绝招之一:GDB调试器

       本文是"降龙十八掌"系列的第一招——GNU DeBuger(GDB)调试器,适用于Linux系统,以Ubuntu .和gdb v8.1.1为例。本文将深入探讨GDB的底层原理和在Linux内核调试中的应用。

       首先,GDB底层实现始于gdbserver的main函数,该函数实际上通过captured_main函数完成初始化,包括解析用户指令、初始化核心服务并启动事件循环。核心服务初始化时,会通过ptrace和调试core文件,确保功能可用。例如,创建子进程,设置追踪状态,以及插入断点等操作都在这个过程中完成。

       插入断点的实现涉及gdb的breakpoint.c和infrun.c,通过initialize_breakpoint_ops创建断点,然后调用相应函数,如insert_memory_breakpoint,将断点指令插入目标地址。

       此外,文章还分享了如何利用GDB调试实际的内核代码,如在qemu中的arm Linux,通过交叉编译和gdb-server实现远程调试。通过模拟异常,如动态加载模块时的越界错误,展示了如何通过GDB一步步追踪到问题所在。

       深入学习GDB,可参考官方文档,如sourceware.org/gdb/current/和sourceware.org/gdb/wiki/,以及一些实用的命令集合。最后,文章推荐了其他与Linux内核编程相关的技术资源,供读者进一步探索。

相关栏目:百科

.重点关注