Tag: gdb

在C中运行时模拟?

这已经在我的列表中待了很长时间。 简而言之 – 我需要在运行mocked_dummy()在运行mocked_dummy()运行mocked_dummy() ,而不需要修改factorial() 。 我不关心软件的切入点。 我可以添加任意数量的附加function(但不能修改/*—- do not modify —-*/内的代码/*—- do not modify —-*/ )。 我为什么需要这个? 对一些传统C模块进行unit testing。 我知道有很多可用的工具,但如果可以运行时模拟我可以改变我的UT方法(添加可重用的组件)让我的生活更轻松:)。 平台/环境? Linux,ARM,gcc。 我正在尝试的方法? 我知道GDB使用陷阱/非法指令来添加断点( gdb内部 )。 使代码可自行修改。 用非法指令替换dummy()代码段,并作为紧接的下一条指令返回 。 控制转移到陷阱处理程序。 陷阱处理程序是一个可重用的函数,它从unix域套接字读取。 传递mocked_dummy()函数的地址(从映射文件中读取)。 模拟函数执行。 从这里开始存在问题。 我还发现这种方法很繁琐,需要大量的编码,有些也在组装中。 我还发现,在gcc下,每个函数调用都可以被挂钩/检测 ,但是再次不是很有用,因为该函数是用来模拟的,无论如何都会被执行。 我可以使用其他任何方法吗? #include #include void mocked_dummy(void) { printf(“__%s__()\n”,__func__); } /*—- do not modify —-*/ void dummy(void) { printf(“__%s__()\n”,__func__); […]

程序接收信号SIGTRAP,跟踪/断点陷阱

我正在调试一个(嵌入式)软件。 我在一个函数上设置了一个断点,由于某种原因,一旦我到达那个断点并continue我总是回到函数(这是一个初始化函数,只能调用一次)。 当我删除断点并continue ,GDB告诉我: Program received signal SIGTRAP, Trace/breakpoint trap. 由于我正在使用断点,我假设我陷入了“断点陷阱”。 什么是断点陷阱?

打印从GDB中的Register指向的字符串

我有一个字符串被移动,我想根据寄存器打印它。 我做了以下事情: gdb x $esp 0xbffff110: “\274\205\004\b\324\361\377\277\334\361\377\277]\257\344\267\304s\374\267” {then I copied the address} >> x *0xbffff110 0x80485bc : “test1” 有没有办法一步到位?

如何在gdb中打破UBSan报告并继续?

最新版本的GCC和Clang具有Undefined Behavior Sanitizer(UBSan),它是一个编译标志( -fsanitize=undefined ),用于添加运行时检测代码。 出现错误时,会显示如下警告: packet-ber.c:1917:23:运行时错误:左移54645397829836991 8个位置无法在类型’long int’中表示 现在我想调试这个并在所述行上获得调试中断。 对于Address Sanitizer(ASAN), ASAN_OPTIONS=abort_on_error=1会导致可捕获的致命错误。 唯一可用的UBSan选项是UBSAN_OPTIONS=print_stacktrace=1 ,这会导致报告的调用跟踪转储。 但是,这不允许我检查局部变量,然后继续该程序。 因此无法使用-fsanitize-undefined-trap-on-error 。 我应该如何在UBSan报告中打破gdb? 虽然break __sanitizer::SharedPrintfCode似乎有效但名称看起来很内部。

GDB:尝试取消引用通用指针

如何使GDB在x/s等打印function中进行额外的解引用? 当我在x/ I中尝试显式解引用时,会出现错误“尝试取消引用通用指针”。 使用x/多次工作,因为每次使用都包含隐式解引用,但这很烦人,因为我必须复制并粘贴每个中间结果。 例 考虑非常有用的C程序, example.c : #include int main(int argc, char **argv) { printf(“argv[0] = %s\n”, argv[0]); } 如果我构建它并将其加载到GDB中,我看到argv存储在0xc(%ebp) ,因为它的双重因素作为第二个参数传递给第24行的printf (即0x4(%esp) ): $ gcc -o example example.c $ gdb example (gdb) disass main Dump of assembler code for function main: 0x080483e4 : push %ebp 0x080483e5 : mov %esp,%ebp 0x080483e7 : and $0xfffffff0,%esp 0x080483ea […]

在尝试将GDB附加到进程时如何解决“ptrace操作不允许”?

我正在尝试使用gdb附加程序,但它返回给我: 附加到进程29139无法附加到进程。 如果您的uid与目标进程的uid匹配,请检查/ proc / sys / kernel / yama / ptrace_scope的设置,或以root用户身份再次尝试。 有关更多详细信息,请参阅/etc/sysctl.d/10-ptrace.conf ptrace:不允许操作。 edb-debugger返回“无法附加到进程,请检查权限,然后重试。” strace返回“attach:ptrace(PTRACE_ATTACH,…):不允许操作” 我将“kernel.yama.ptrace_scope”1更改为0并将“/ proc / sys / kernel / yama / ptrace_scope”1更改为0并尝试使用以下方法设置“set environment LD_PRELOAD =。/ ptrace.so”: #include int ptrace(int i, int j, int k, int l) { printf(” ptrace(%i, %i, %i, %i), returning -1\n”, i, j, k, l); return 0; } […]

-g选项在gcc中做什么

我看到很多关于gdb的教程要求在编译c程序时使用-g选项。 我无法理解-g选项实际上做了什么。

使用gdb进行gfortran调试:w_powf.c:没有这样的文件或目录

我有一个Fortran程序,我正在调试。 我有一个可变数据列表,其中一个预期变量几乎是其预期值的两倍。 所以我用调试标志编译了程序,并开始调试:程序名称是hfock $gdb hfock (gdb) break hfock (gdb) run Starting program: /home/e/Desktop/hfock hfock Breakpoint 1, hfock () at hfock.f:16 16 ZETA1 = 2.173171 (gdb) s 17 ZETA2 = 1.188530 (gdb) s 18 WRITE (*, ‘( “Zeta1:”, F7.4 / “Zeta2:”, F7.4 )’ ) ZETA1, ZETA2 (gdb) s Zeta1: 2.1732 Zeta2: 1.1885 21 PLUS=ZETA1+ZETA2 (gdb) s […]

解码和理解汇编代码

所以有点背景。 我是c和汇编代码的初学者,我们有一个“炸弹”赋值(用c编写)调用需要某些密码的方法,但代码不可见,我需要通过查看汇编代码来确定正确的密码。 代码表明此方法的密码是6个数字,它作为“输入”传递给方法阶段2(我试图避免触发)。 我感到困惑的部分是从+64跳到+42。 它似乎是一个循环,但我不确定每次传递如何影响堆栈。 如果最后两个数字是相同的,它看起来像循环退出,并且它与添加和减去4有关,但我不确定如何遍历地址。 如果任何人都可以翻译正在发生的事情,或者如果我需要查看任何特定的寄存器/位置,那将会有很大帮助。 还有4个阶段,每个阶段都应该更加复杂,所以我希望能够很好地理解如何阅读这些阶段。 此外,如果任何人有一个良好的资源(如可打印表)与汇编代码关键字也会有所帮助,如果32位和64位寄存器之间有任何差异,我需要担心除寄存器名称之外。 。 82 phase_2(input); (gdb) disas phase_2 Dump of assembler code for function phase_2: 0x000000000040106b : push %rbp 0x000000000040106c : push %rbx 0x000000000040106d : sub $0x28,%rsp 0x0000000000401071 : mov %rsp,%rsi 0x0000000000401074 : callq 0x401457 0x0000000000401079 : cmpl $0x0,(%rsp) 0x000000000040107d : jne 0x401086 0x000000000040107f : cmpl $0x1,0x4(%rsp) 0x0000000000401084 […]

程序接收信号SIGTRAP,跟踪/断点陷阱。

我知道之前已经问过这个问题,但是我已经阅读了所有的主题并且没有找到答案。 从我执行run开始调试我的项目的那一刻起,我得到了: Program received signal SIGTRAP, Trace/breakpoint trap. [Switching to Thread 6] Program received signal SIGTRAP, Trace/breakpoint trap. [Switching to Thread 6] 。 当我执行ctrl+c ,gdb告诉我: Program received signal SIGINT, Interrupt. 0x00000000 in ?? () Program received signal SIGINT, Interrupt. 0x00000000 in ?? () 通常它会告诉我哪个文件和哪个函数在不是0x00000000 in ?? ()时被中断0x00000000 in ?? () 0x00000000 in ?? () GDB不再遇到断点,让事情变得更加疯狂的事实是,我和同事正在共享相同的会话(调试是使用cygwin和远程机器完成的),它对他们来说很好但不适合我。 […]