随笔分类 -  gdb代码分析

gdb 反汇编disas源码排列问题
摘要:# 问题 在开发过程中,可能需要查看cpp文件生成的汇编代码来确认一些问题。由于单纯的汇编代码看起来并不太容易捋清楚内部逻辑,所以最好能够把源代码的位置列出来。在gdb的早期版本中,这个功能是通过disas命令的/m修饰符(选项)来实现的。 如果使用过这个选项就会发现,这个功能显示的结果使人非常困惑 阅读全文

posted @ 2023-07-29 17:51 tsecer 阅读(289) 评论(0) 推荐(0) 编辑

gdb如何比较core文件和image及buildid
摘要:gdb 从git上看到的提交记录,关键的修改是在elf_core_file_matches_executable_p函数中添加的对于build_id的比较。 ///@file: gdb-10.1\bfd\elfcore.h bfd_boolean elf_core_file_matches_exec 阅读全文

posted @ 2023-05-15 20:06 tsecer 阅读(171) 评论(0) 推荐(0) 编辑

如何在gdb中再次显示core的摘要信息
摘要:问题 在使用gdb加载core文件开始的时候会显示导致core的直接原因,但是随着分析的进行,gdb的输出会越来越多,如果想回过头来再次(again)确认下这些导致core的信息,此时有没有什么命令可以把加载core文件时的信息再输出一遍? 在stackoverflow上相似问题。 when loa 阅读全文

posted @ 2023-03-18 15:45 tsecer 阅读(168) 评论(0) 推荐(0) 编辑

为什么gdb通过0地址显示偏移会提示地址错误
摘要:现象 在gdb中,如果想看一个struct的某个field的偏移量,和C语言一样可以通过对一个0地址变量取地址,然后取成员的偏移量获得。更神奇的地方在于和C语言一样,这里也不会触发内存访问异常。 另外还有一个奇怪的现象:对于x取地址的时候没有问题,但是对于c字段取地址之后会有一个莫名其妙的错误提示" 阅读全文

posted @ 2022-12-08 22:35 tsecer 阅读(729) 评论(0) 推荐(0) 编辑

gdb的pretty-printer实现及使用
摘要:一、pretty printer 即使在有调试器的情况下,打印(print)信息也是定位问题的重要和有效手段,所以一些变量的打印就非常重要,例如C++中流行的libfmt库,gcc扩展的"PRETTY_FUNCTION "宏变量。gdb作为调试程序的主要通用工具,也包含了对类型的pretty-pri 阅读全文

posted @ 2022-08-26 20:03 tsecer 阅读(2623) 评论(0) 推荐(0) 编辑

gdb的set follow-fork-mode child如何工作
摘要:一、 clone函数的man手册说明 clone man手册的说明: /* Prototype for the glibc wrapper function */ #include <sched.h> int clone(int (*fn)(void *), void *child_stack, i 阅读全文

posted @ 2022-04-27 19:55 tsecer 阅读(386) 评论(0) 推荐(0) 编辑

gdb脚本的流程控制及变量
摘要:一、问题 如果我们希望在一个断点的command中再设置一个breakpoint的command,从gdb的文档看,当前是不支持这种功能的,所以此时需要考虑其他的方法。下面是gdb文档说明Any other commands in the command list, after a command 阅读全文

posted @ 2021-12-27 20:39 tsecer 阅读(825) 评论(0) 推荐(0) 编辑

gdb如何实现info vtbl命令
摘要:一、命令使用 在gdb中,可以通过info vtbl来查看一个指定对象指针的当前虚函数表信息。这里比较简单的问题是虚函数的位置,但是在多重继承甚至虚继承的情况下这个问题其实也并不简单。另一个基础问题是一个类型的虚函数表的大小。下面是使用gdb的一个例子tsecer@harry: cat gdb.pa 阅读全文

posted @ 2021-10-30 17:33 tsecer 阅读(681) 评论(0) 推荐(0) 编辑

gdb的reverse execute功能及实现
摘要:一、gdb中record命令的功能 在有些时候,程序运行到某个阶段出现了异常,例如堆栈发生了破坏,此时希望有一个“时光机”能反方向执行,直到首次发生异常的地方。当然,如果是内存修改,其实可以使用watch这个更简单高效的命令来实现,这可能也是这个命令不怎么常见的一个原因吧。不论如何,这个命令还是有点 阅读全文

posted @ 2021-03-15 20:50 tsecer 阅读(415) 评论(0) 推荐(0) 编辑

gdb通过frame切换栈帧之后寄存器是否准确
摘要:一、问题 在使用寄存器调试一些堆栈破坏的core文件时,可能需要通过反汇编来确定问题的原因,而此时确定寄存器的值就是一个必要的手段。但是,在通过frame切换栈帧之后,通过info reg看到的寄存器就是该栈帧当前的寄存器值吗? 二、gdb的文档说明 if all stack frames fart 阅读全文

posted @ 2019-08-18 10:13 tsecer 阅读(1490) 评论(0) 推荐(0) 编辑

gdb硬件watch实现及call实现的一个例证
摘要:一、gdb 硬件watch断点原理 1、直观的例子 硬件断点的watch功能是查找内存被改写的一个必备工具,和其它调试器断点功能一样,它可以快速的理解一个系统的特定方便而不用理解整个系统。对于某些关键变量,我们想知道有哪些地方使用或者初始化这些数据,只需要在该表达式打上数据断点,待命中时查看调用链即 阅读全文

posted @ 2019-03-07 09:38 tsecer 阅读(1605) 评论(0) 推荐(0) 编辑

gdb之jump指令及修改函数返回值
摘要:一、进程调试主要发生在一些调试环境中,文件的编译我们可以认为比较麻烦,或者说我们并不像真正的修改源代码,因为测试的代码修改之后还要改回来;麻烦不说,如果修改之后测试代码没有改回来,那么问题就更加严重了,所以我们尽量希望通过gdb工具来环保的修改程序的行为,这样我们就可能使用到下面的一些方法和指令。二 阅读全文

posted @ 2019-03-07 09:13 tsecer 阅读(2596) 评论(0) 推荐(0) 编辑

gdb动态库延迟断点及线程/进程创建相关事件处理(下)
摘要:一、被调试任务所有so文件如何枚举在前一篇博客中,大致说明了gdb是通过一个动态库提供的回调函数(_dl_debug_state)处埋伏断点,然后通过约定好的_r_debug全局变量来得到exe程序对应的link_map,然后以该结构为队列头来遍历被调试任务中所有的so文件。当时也说了这个地方比较模 阅读全文

posted @ 2019-03-06 21:46 tsecer 阅读(393) 评论(0) 推荐(0) 编辑

gdb调试器之"测不准原则"
摘要:一、测不准原则我大学物理学的不太好,特别是高等物理,这个概念是在很多科普性的读物中都可以见到,就像”罗素悖论“、哥德尔的”不完备理论“、爱因斯坦的”相对论“等,大家都是一知半解,然后根据这个概念大家自由发挥,所以就有千奇百怪的场景和理解了,最后以讹传讹,倒也不清楚这个东西原始真正意义,这种现象在很多 阅读全文

posted @ 2019-03-06 21:46 tsecer 阅读(407) 评论(0) 推荐(0) 编辑

gdb动态库延迟断点及线程/进程创建相关事件处理(上)
摘要:一、gdb对共享库符号的支持当使用gdb调试一些动态链接生成的可执行文件时,我们可能会有意或者无意的在一些不存在的函数上打断点,此时gdb并不是提示错误,而是提示是否在之后加载的动态库中添加该断点,也就是pending断点,下面是一个典型的提示:(gdb) b noexistingFunction 阅读全文

posted @ 2019-03-06 21:45 tsecer 阅读(2288) 评论(0) 推荐(0) 编辑

gdb如何调用被调试任务的特定函数
摘要:一、gdb中函数调用在gdb中,可以通过call function(args……)来调用一个函数,当然也可以使用print之类的函数来间接的调用一个函数,但是不管如何,它们最终都要求gdb来调用一个函数,执行该函数,取函数返回值等基本逻辑处理。现在想一下gdb是如何让被调试进程执行特定函数的,这里包 阅读全文

posted @ 2019-03-06 21:29 tsecer 阅读(2634) 评论(0) 推荐(0) 编辑

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示