Tag: gdb

指示GDB 6.5使用嵌入在目标文件中的源

我一直在尝试使GNU gdb 6.5-14在调试时使用嵌入在目标文件中的源代码,而不是扫描一些目录。 主要原因是我为嵌入式平台开发并且我交叉编译,这意味着所有源都在我的计算机中。 我读到了-ggdb3标志,其中包含许多额外信息,包括源代码。 所以我开始使用那个标志进行编译。 做一个objdump -S src/lib/libfoo.so确实打印出所有源代码,汇编代码与源代码混合在一起,所以我猜它确实包含了那些信息。 唯一的事情是GDB不打印它,除非我从包含源的工作空间的nfs挂载版本运行。 有谁知道如何指示gdb在目标文件中查找代码而不是依赖外部文件?

关于’gdb’下尾部优化代码的疑问

考虑C中的尾递归因子实现: #include unsigned long long factorial(unsigned long long fact_so_far, unsigned long long count, unsigned long long max_count){ if (max_count==0 || max_count==1 || count >= max_count) return fact_so_far; else { printf(“%llu %p \n”, count, &factorial); return factorial(fact_so_far * count, ++count, max_count); } } int main(int argc, char **argv) { unsigned long long n; scanf(“%llu”, &n); printf(“\n […]

在使用GDB的Eclipse CDT中,Scanf似乎无法在调试模式下工作

在调试模式下运行此代码时: #include #include int main() { int a, b, c; scanf(“%d%d%d”, &a, &b, &c); printf(“Values entered: %d %d %d\n”, a, b, c); return EXIT_SUCCESS; } 该程序不会请求任何用户输入,只会输出: 输入值:18 78 2130026496

如何判断进程地址空间中加载共享库的位置?

我正在尝试调试一个共享库,我有源代码和调试符号,以便使用gdb。 我没有实际使用这个共享库的进程的调试符号或代码(我自己编译它,所以我可以拥有所有内容,但是生成的二进制文件被剥离,以模拟我没有代码的情况)。 该进程打印我正在尝试调试的目标函数foo的地址,以测试gdb是否知道共享库中符号的正确位置。 foo存在我的共享库。 我的打印方法是将以下行添加到使用我的共享库的二进制文件中: printf(“%p\n”, foo) …而且为了增加复杂性,这是一个我正在远程调试的Android系统。 我正在尝试的方案如下: 估计的正好: root@phone:/proc/23806 # gdbserver –attach :5555 23806 Attached; pid = 23806 Listening on port 5555 Remote debugging from host 127.0.0.1 在主持人: [build@build-machine shared]$ /home/build/shared/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/arm-eabi-gdb GNU gdb (GDB) 7.3.1-gg2 Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free […]

使用GDB调试以编程方式调用的函数

我正在为ARM32调试一个软件。 我已经能够使用call ,甚至print以编程方式在GDB中调用函数。 问题是我似乎无法在函数上设置断点,然后以编程方式调用它。 例如,如果我这样做: break test_function call test_function() 然后我收到错误消息 正在调试的程序在从GDB调用的函数中停止。 评估包含该function的表达。 当函数执行完毕后,GDB将默默停止。 有没有办法以编程方式使用GDB调用函数并逐步执行它?

GDB在arrays初始化时报告“当前上下文中没有符号”

我试图初始化一个大小为ceil(buflen / 125.0)的数组,如下所示: long long maxjpg = ceil(buflen/125.0); long long arr[maxjpg]; 我没有收到编译器错误,但GDB报告“当前上下文中没有符号’arr’”。 我发现的唯一修复方法是将数值硬编码到数组大小中,如下所示: long long arr[5]; 我尝试使用const和这些方法的任意组合使用不同的变量类型进行转换。 我知道ceil会返回一个double ,我也尝试过使用它。 初始化值并将其打印如下工作: arr[0] = 25; printf(pos 0 is %d\n”, arr[0]); 输出: pos 0 is 25 在该修改之后打印arr[0]到GDB导致“值已被优化”。 重现的最低可行代码: #include int main(void){ long long size = ceil(123.45); long long arr[size]; return 0; } GDB Fedora 7.4.50.20120120-52.fc17

不希望netbeans调试器进入反汇编窗口

我使用NetBeans IDE 7.4(Build 201310111528)进行C编程。 每次我调试程序时,对于每个printf和scanf(或者可能是每个系统调用),它都会打开反汇编窗口并遍历每个汇编代码。 我只是想看变量而与这些函数的汇编代码无关。 我认为在netbeans 6.9左右之前,它从未发生过,并且调试很顺利,只需在标准输入或输出上打印或扫描,而不会进入讨厌的汇编代码。 我如何简单地禁止它进入汇编代码并根据源代码行进行调试?

GDB:在给定范围内观察变量

有了GDB,我可以watch i ,每当i改变就会打破。 问题是我有多个使用名称i函数,因此GDB会破坏所有这些函数。 是否有可能在i改变时中断,但只能在给定的函数内部?

从文件gdb输入重定向

我无法让gdb将文件重定向到我的程序的标准输入。 在gdb ./prog.x < someinput.txt完全符合我的要求。 在gdb里面,当我运行(gdb) run < someinput.txt我的程序似乎并没有“看到”输入文件,而是stdin似乎正在读取我在控制台中键入的内容。 (gdb) run < testinput.txt Starting program: /Users/alexpatch/Documents/krc/misc/sandbox.x < testinput.txt [New Thread 0x1603 of process 8308] 我的光标出现在其下方的空白行,我可以在其中输入一些文字。 Cd打破了那个,然后程序的输出与我刚输入的内容一起运行,并且该过程正常退出。 /* trivial code example */ #include int main(void) { int c; while ((c = getchar()) != EOF) putchar(c); return 0; } 我找到了一些与类似问题相关的答案,但似乎对他们(gdb) run < someinput.txt的解决方案就是我已经在做的,即(gdb) run < someinput.txt 。 […]

确定预处理器中的优化级别?

-Og是一个相对较新的优化选项,旨在改进应用优化时的调试体验。 如果用户选择-Og ,那么我希望我的源文件激活备用代码路径以增强调试体验。 GCC提供__OPTIMIZE__预处理器宏 ,但只有在优化生效时才将其设置为1。 有没有办法学习优化级别,如-Og , -O3或-Og ,以便与预处理器一起使用?