Tag: gdb

GDB无法插入断点,无法访问地址XXX的内存?

我写了一个非常简单的程序: ebrahim@ebrahim:~/test$ cat main.c int main() { int i = 0; return i; } 我用-s编译剥离模式: ebrahim@ebrahim:~/test$ gcc -s main.c -o f3 ebrahim@ebrahim:~/test$ file f3 f3: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=4dc6b893fbae8b418ca41ddeef948df1fcb26d3d, stripped 现在,我正在尝试使用GDB找出主函数起始地址: ebrahim@ebrahim:~/test$ gdb -nh f3 GNU gdb (Ubuntu 7.11.90.20161005-0ubuntu2) 7.11.90.20161005-git Copyright (C) […]

gdb反向调试avx2

所以我有一个新的花式cpu支持avx2指令集。 这很好,但打破了gdb反向调试。 在没有优化的情况下进行编译时,代码仍然使用共享库,例如调用memset()然后调用memset的avx2优化版本。 这很好,但gdb记录不支持avx2。 进程记录不支持地址0x7ffff690dd80处的指令0xc5。 0xc5是这里的vex前缀。 反向调试适用于不支持avx2的cpu。 如何让libc等不使用avx2优化版本的库调用,以便我可以使用gdb记录,向后退步等? 我试过了 LD_BIND_NOW=1 LD_HWCAP_MASK=0 compiling with -static 如果没有在旧机器上调试,我就没有想法了。

GDB说“没有符号表”,但nm显示文件有调试符号

我正在尝试使用GDB调试一个简单的C项目,但无论我如何编译它,GDB似乎都找不到该程序的调试符号。 当我将程序加载到GDB时,它声称已成功读取符号,因为它打印 Reading symbols from /home/edward/…done. 但是,当我运行程序时,打破分段错误,并输入info locals ,它说 No symbol table info available. 另外, bt表明执行在我写的函数(不是系统或库调用)中停止,但是没有行号信息,只有原始内存地址。 为什么GDB不能找到或使用之前成功读取的符号? 我在我正在运行的二进制文件上运行nm和objdump ,它们都显示了.debug_info , .debug_line等部分,因此该文件确实包含调试符号。 我通常使用Makefile编译,设置以下标志: CFLAGS = -mno-red-zone -fno-omit-frame-pointer -ggdb -O0 -I. -Wdeclaration-after-statement -Wall 当我调用gcc时,我可以看到它被使用。 但是,我尝试更改为-g ,并通过在简单的测试文件上调用gcc -g -O0手动编译,结果仍然相同:二进制文件包含调试符号,GDB读取它们,但调用任何GDB命令都会产生一条消息,指出调试信息不​​可用。 更新 我正在运行Ubuntu 12.04,我的GDB版本是7.4,而我的GCC版本是4.8.1。 如果我在GDB中set complaints 10000然后加载文件,它会打印以下投诉: Reading symbols from /home/edward//minithread… DW_AT_low_pc 0x400690 is not < DW_AT_high_pc 0x33 for DIE […]

如何让gdb以hex模式打印出所有值?

默认情况下,gdb始终打印/显示基数为10的所有变量/参数。有什么方法可以让gdb在打印任何内容时始终使用base 16(当我不需要时返回默认设置)? 我知道它可以通过提供打印/显示的’/ x’参数来打印,但我不想每次都这样做….

在调用函数时使GDB打印控制流程

如何调用感兴趣的gdb打印函数,根据堆栈的深度缩进? 我希望能够说出(制作): (gdb) trace Foo* Bar* printf 并让gdb打印所有以Foo或Bar开头的函数,因为它们被调用。 有点像gnu cflow,除了使用调试符号和仅实际调用的打印函数,而不是所有可能的调用流。 无法帮助的工具包括cachegrind,callgrind和oprofile,它们最常调用函数的结果。 我需要保留的调用顺序。 通配符(或等效的)是必不可少的,因为有很多Foo和Bar函数。 虽然我愿意完全记录所有function。 或者,也许告诉gdb记录特定库中的所有函数。 某些GDB向导必须有一个用于此常见作业的脚本!

修改参数时gdb打印错误的值

系统 全新安装的代码块12.11 + mingw pack。 win7 64 gcc 4.7.1 gdb 7.5 示例代码 用-g编译,没有优化。 #include void foo(int a, int b); int main() { foo(400, 42); return 0; } void foo(int a, int b) { a = a – 10; b = a + 1; printf(“y2 %d\n”, b); } 问题 我在“void foo(int a,int b)”上放了一个断点,当我逐步浏览3行时,我看起来是b的值。 无论是使用代码块调试function还是使用gdb命令行, b的值都是42而不是391 。 […]

GDB在linux中使用coredump文件

我刚刚在linux中获得了一个core-dump文件 ulimit -c unlimited 我该如何附加gdb 我需要给它命令行参数。 样本执行: ./my_prog arg 帮我进入gdb 干杯!!

在gdb会话中调用malloc失败

我正在尝试调试一个C程序,gdb告诉我在某个函数的第329行有一个段错误。 所以我为该function设置了一个断点,我试图逐步完成它。 但是,每当我点击第68行时,我都会从gdb收到此投诉: (gdb) step 68 next_bb = (basic_block *)malloc(sizeof(basic_block)); (gdb) step *__GI___libc_malloc (bytes=40) at malloc.c:3621 3621 malloc.c: No such file or directory. in malloc.c 我不知道这意味着什么。 该程序在除一组输入之外的所有输入上运行完美,因此在执行该程序的其他执行期间,对malloc的调用显然成功。 当然,我有: #include . 这是源代码: // Block currently being built. basic_block *next_bb = NULL; // Traverse the list of instructions in the procedure. while (curr_instr != NULL) { simple_op […]

GDB:自动’下一步’?

这一次很快。 是否有可能(除了永远按下输入)gdb不断地通过一个程序一行一行地找到错误发生的位置? 编辑: continue不是我想要的; 我想有效地看到完整的程序执行,一行一行,就像你从next反复获得的那样。

如何在Eclipse中默认停止GDB执行“break main”?

我正在使用Eclipse和MinGW开发一个C项目。 运行此项目的调试版本时,gdb始终在输入main()中断。 我可以看出为什么这可能有用,但对于我目前的项目,我不希望这种情况发生。 我读过有一个命令 (gdb) break main 从命令行运行时将完成相同的行为。 目前我没有.gdbinit文件。 目前,gdb在从命令行运行时不会停止进入main,但是从Eclipse运行时它会执行。 如何在Eclipse中默认进入main时使GDB停止运行?