Tag: gdb

gdb显示的地址与代码中的地址不同

我试图实现缓冲区溢出攻击,我需要知道我试图溢出的缓冲区的地址。 使用GDB显示的地址与我在代码中执行此操作时的地址不同: 确切代码: #include int main() { char buffer[20]; printf(“%p\n”, buffer); // 0xbffff320 return 0; } 但是,如果我这样做在gdb中: p &buffer 我得到: 0xbffff330 为什么会有差异,它会搞砸我的缓冲区溢出攻击? 我禁用了ALSR和堆栈防护。 谢谢。 编辑1:即使我单步执行gdb并遇到打印行,我也会得到0xbffff320作为地址 编辑2: 环境:在Windows 7上的虚拟框中运行Ubuntu Linux 9映像。 gdb版本:6.8-debian 使用GCC编译,如: gcc -g -fno-stack-protector filename.c立即执行: ./a.out地址打印:0xbffff320 然后在调试器中打开如下: gdb ./a.out然后输入b main然后run p &buffer 然后地址是0xbffff330 编辑3: 这是重现行为的gdb日志: $ gdb ./a.out b主要 跑 这里的p&buffer / *地址与我运行的可执行文件时显示的不同* / […]

如何使用gdb来探索堆栈/堆?

有谁能请给我一个快速概述/指向我检查C程序的堆栈(和堆?)的方法的文档? 我认为这应该用GDB来完成,但是如果还有其他更直接的选择,那么这应该没问题。 谢谢。

gdb终止了信号?,未知信号

我只是想在Mac OSX版本10.12上使用gdb调试代码,但在gdb中启动程序时总是会遇到此未知错误。 我在安装后对gdb进行了编码,并使用-g标志编译了我的代码。 这就是发生的事情: computer:hello user$ gdb a.out GNU gdb (GDB) 7.12 Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type “show copying” and “show warranty” […]

远程GDB调试

我花了一整天的时间试图找到一种方法来从Qt Creator或Eclipse启用GDB调试。 我了解到基本上有两种方法可以启动目标应用程序: 使用ssh( ssh host gdb ) 使用gdbserver 我能够使用这两种方法远程启动gdb并启动应用程序。 但是,GDB永远不会响应IDE中设置的任何断点。 此外,我无法暂停应用程序以检查程序状态。 在Qt Creator中,我只是得到了一个模糊的堆栈跟踪(我可能一直在查看ssh或gdb的痕迹……)。 任何人都可以帮助我开始吗? 进展! 我发现使用Qt Creator 2.0有一个名为“附加和调试远程应用程序”的function。 它基于gdbserver。 好处是它在IDE的断点处停止。 但是,有两个问题: 当它遇到断点时,它只显示汇编代码,而不是源代码。 由于“收到信号”,GDB经常退出 我应该提一下,远程可执行文件是使用旧版本的GCC编译的,而不是安装在我本地PC上的版本。 也许有些问题与此有关。 更新 我应该提一下,我通过SSH切换到远程机器上运行cgdb 。 远程Qt Creator解决方案不稳定。 由于神秘的“信号接收”消息,GDB倾向于退出。

如何让GDB摆脱循环?

我可以告诉GDB使用return立即从函数return ,并使用call myFunction调用函数。 但是如何让它摆脱目前的循环呢? 即表现好像是break; 声明。 是jump myfile.c:的方法吗?

SIGTRAP尽管没有设置断点; 隐藏的硬件断点?

我正在为STM32嵌入式系统调试这个软件。 在其中一个函数中,我的程序一直在遇到某种断点: SIGTRAP,跟踪/断点陷阱 但是,在GDB中,当我执行info breakpoints我得到No breakpoints or watchpoints 。 断点实际上对应于我在很久以前设置的断点,在另一个版本的可执行文件中。 当我设置该断点时,GDB告诉我automatically using a hardware breakpoint on read-only memory (或类似消息) automatically using a hardware breakpoint on read-only memory 。 我认为硬件断点仍然在我的芯片上,尽管已经加载了新版本的软件。 如果确实存在虚假断点,我该如何找到并删除它?

暂停没有断点的gdb

当我在Xcode中调试程序时,我可以在调试器控制台中暂停执行。 有没有办法在命令行中使用gdb? 我想这样做,所以我可以在程序启动后修改断点。

gdb:为SIGBUS处理程序设置断点

我正在尝试使用GDB调试一个简单的停止和复制垃圾收集器(用C语言编写)。 GC通过处理SIGBUS来工作。 我在SIGBUS信号处理程序的顶部设置了一个断点。 我告诉GDB将SIGBUS传递给我的程序。 但是,它似乎不起作用。 以下程序(内联解释)显示了我的问题的本质: #include #include #include #include #define HEAP_SIZE 4096 unsigned long int *heap; void gc(int n) { signal(SIGBUS, SIG_DFL); // just for debugging printf(“GC TIME\n”); } int main () { // Allocate twice the required heap size (two semi-spaces) heap = mmap(NULL, HEAP_SIZE * 2, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, […]

如何在GDB中查看像数组一样的指针?

假设已定义: int a[100]类型print a然后gdb将自动将其显示为数组: 1, 2, 3, 4… 但是,如果将a作为参数传递给函数,那么gdb会将其视为普通的int指针,类型print a将显示: (int *)0x7fffffffdaa0 。 如果我想查看数组,我该怎么办?

将libc回溯转换为源行号

我有一个MPI应用程序,它结合了C和Fortran源。 偶尔它会因为与内存相关的bug而崩溃,但是我很难找到这个bug(它是在别人的代码中的某个地方,目前我并不是很熟悉)。 我还没有能够用gdb捕获它,但有时会输出glibc backtrace,如下所示。 该错误可能接近“(main_main_ + 0x3bca)[0x804d5ce]”,(但有内存错误,我知道情况可能并非如此)。 我的问题是,有没有人知道如何将+ 0x3bca或0x804d5ce转换为代码的特定行? 关于追踪这个错误的任何其他建议也将受到赞赏。 我对gdb的基础知识非常熟悉。 *** glibc detected *** /home/…/src/finite_element: munmap_chunk(): invalid pointer: 0x09d83018 *** ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(+0x73e42)[0xb7409e42] /lib/i386-linux-gnu/libc.so.6(+0x74525)[0xb740a525] /home/…/src/finite_element(main_main_+0x3bca)[0x804d5ce] /home/…/src/finite_element[0x804e195] /home/…/src/finite_element(main+0x34)[0x804e1e8] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb73af4d3] /home/davepc/finite-element/src/finite_element[0x8049971] ======= Memory map: ======== 08048000-08056000 r-xp 00000000 08:05 1346306 /home/…/src/finite_element 08056000-08057000 r–p 0000d000 08:05 1346306 /home/…/src/finite_element 08057000-08058000 rw-p 0000e000 08:05 1346306 /home/…/src/finite_element 09d1b000-09d8f000 rw-p […]