问题标签 [gdb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
590 浏览

iphone - iPhone调试:变量不是最新的?

我最近才开始广泛使用调试器,所以我不确定这是否是一个限制。

当我在 iPhone 上调试时,变量不是最新的,除非我明确查看它 ( ctrl+ click-> view variable as expression)。有没有办法在不显式查看的情况下查看实际变量?

0 投票
2 回答
2149 浏览

linux - 如何调试远程 linux 二进制文件?

情况如下:

我有一个崩溃的 linux 二进制文件。没有日志文件、跟踪文件等。我需要能够将调试器附加到它(我在本地有源)并跟踪错误。

解决这个问题的最简单、最好的方法是什么?

0 投票
7 回答
16456 浏览

gdb - 使用 GDB 检查映射地址

我正在使用我在 Linux 的 Direct Memory Access 上发布的驱动程序将一些物理内存映射到用户空间地址。但是,我不能使用 GDB 查看任何地址;即,x 0x12345678(其中 0x12345678 是 mmap 的返回值)失败并出现错误“无法访问地址 0x12345678 处的内存”。

有没有办法告诉GDB这个内存可以查看?或者,我可以在 mmap 中做一些不同的事情(调用或 foo_mmap 那里的实现)允许它访问这个内存吗?

请注意,我不是在询问 /dev/mem(如第一个片段中那样),而是询问通过 ioremap()、virt_to_phys() 和 remap_pfn_range() 获取的内存的 mmap

0 投票
5 回答
62146 浏览

gcc - gcc -ggdb 和 gcc -g 有什么区别

当我使用 gcc 编译 C 程序时,我通常使用-g将一些调试信息放入 elf 文件中,以便 gdb 可以在需要时帮助我。

但是,我注意到有些程序使用-ggdb, 因为它应该使调试信息对 gdb 更友好。

它们有何不同,推荐使用哪个?


注意:调试程序或 GCC 选项的链接,http ://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

0 投票
5 回答
12942 浏览

linux - GDB 远程调试错误

我试图在 x86_64 suse linux 上远程调试一个 32 位应用程序,但得到这个“远程寄存器格式错误”的错误。

我启动 gdbserver 作为监听端口 12345 (gdbserver localhost:12345 my_prog)

这是错误:

这是调试服务器机器(uname -a):

Linux 服务器 2.6.16.60-0.31-smp #1 SMP Tue Oct 7 16:16:29 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

这是调试客户端机器(uname -a):

Linux 客户端 2.6.16.54-0.2.5-default #1 Mon Jan 21 13:29:51 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux

两台机器都在虚拟机中运行(VMWare)。gdbserver 二进制文件从客户端机器复制到服务器机器。

(我远程调试是因为调试服务器上的运行时环境类似于生产环境,并且不包含任何开发工具、对源代码的访问等)

欢迎任何建议。

更新:通过在 gdb 中发出以下命令,这对我有用:

设置架构 i386:x86-64

0 投票
4 回答
2158 浏览

debugging - 如何进行库的源代码级调试

我有以下设置。尽管我的工作设置在 Windows 主机上处理 ARM 编译器 Real View Developer Suite (RVDS) 3.2,但对于任何主机上的任何其他 C 编译器来说,这种情况都是通用的。

我在 Windows 主机上使用 RVDS 3.2 编译器工具链构建了 C 代码的 ARM 库(静态库 - .a 文件)。然后,我将这个库与使用 Linux 主机上的 ARM-Linux 编译器工具链的应用程序链接,以获得 ARM 可执行文件。现在,当我尝试使用 gdb 在 Linux 上调试此生成的 ARM 可执行文件时,尝试在链接的库中存在的某个函数中放置断点,gdb 无法在此处放置断点,因为找不到源。所以我手动复制了所有用于在可执行文件所在的 Linux 文件夹中创建库的源文件 (*.c)。gdb 仍然无法设置断点。所以现在我开始思考:

  1. 如何通过在 gdb 中启动通过将此库链接到应用程序而生成的可执行文件,使用不同的编译器链在 Windows 上创建该库的源代码级调试。可能吗?我该怎么做?RVDS 编译器工具链中是否有任何编译器选项可启用此库源代码级调试?

  2. 我是否需要将源文件复制到 linux 中与这些源文件在 windows 中完全相同的文件夹结构中?

0 投票
8 回答
11505 浏览

gdb - 在 MinGW 上的 GDB 中,如何让 Ctrl-C 停止程序?

我在 Windows 上,在 MinGW 下构建的可执行文件上运行 GDB。该程序有一个无限循环。我想通过点击Ctrl+来找到它C。当我这样做时,程序和 GDB 都会退出。关于这个主题的所有帮助似乎都假设我在 Linux 上。

0 投票
2 回答
5330 浏览

debugging - “步入”时如何让GDB不打印函数参数值?

当遇到断点并单步执行函数时,gdb 6.8 版会打印函数名称,后跟函数参数。

碰巧的是,在我正在调试的程序中,参数值之一是通过引用传递的巨大记录。gdb打印变量名,后跟其所有成员变量。从字面上看,gdb需要一两分钟来打印类中包含的所有成员变量......这在调试时真的很烦人。

我很确定有一个设置可以禁用此行为,该设置是什么?

0 投票
3 回答
1140 浏览

python - 您如何自动化大型项目的启动/调试?

设想:

有一个复杂的软件,手动启动很烦人。我所做的是创建一个 python 脚本来启动可执行文件并附加gdb进行调试。

进程启动脚本:

  • 确保设置了环境变量。
  • 确保将本地构建目录添加到环境LD_LIBRARY_PATH变量中。
  • 将当前工作目录更改为可执行文件期望的位置(不是我的设计)
  • 使用配置文件启动可执行文件是唯一的命令行选项
  • 将可执行文件的输出通过管道传输到第二个日志记录进程
  • 记住可执行文件的 PID,然后启动并将 gdb 附加到正在运行的可执行文件。

该脚本有效,但有一个警告。ctrl-c 不会中断被调试者并将控制权返回给 gdb。因此,如果我在没有活动断点的情况下“继续”,我将永远无法再次停止该进程,它必须被另一个 shell 杀死/中断。顺便说一句,运行“kill -s SIGINT <pid>”,其中 <pid> 是被调试者的 pid,确实让我回到了 gdb 的提示符......但是必须以这种方式做事真的很烦人

起初我以为 Python 正在抓取 SIGINT 信号,但情况似乎并非如此,因为我设置了信号处理程序将信号转发给被调试者,但这并不能解决问题。

我已经尝试了对 python 脚本的各种配置(调用 os.spawn* 而不是子进程等)。似乎无论我怎么做,如果 python 启动子进程,SIGINT (ctrl-c) 信号不要路由到 gdb 或子进程。

目前的思路

  • 这可能与被调试者和 gdb 需要一个单独的进程组 ID 相关......对此有任何信任吗?
  • SELinux 可能的错误?

信息:

  • 数据库 6.8
  • Python 2.5.2(Python 2.6.1 也存在问题)
  • SELinux 环境(向进程传递信号的错误?)

我考虑过的替代方案:

  • 设置一个 .gdbinit 文件来完成脚本所做的工作、环境变量和当前工作目录是这种方法的一个问题。
  • 手动启动可执行文件并附加 gdb (yuck)

问题: 您如何自动化大型项目的启动/调试?

更新: 我在下面尝试了 Nicholas Riley 的示例,在我家里的 Macintosh 上,它们都允许 cntl-c 以不同的程度工作,在生产 boxen(我现在相信它可能正在运行 SELinux)上它们不...

0 投票
3 回答
9213 浏览

c - 如何检测堆栈溢出的点

我的 C 程序有以下问题: 某处是堆栈溢出。尽管在没有优化和调试器符号的情况下进行编译,但程序会以以下输出退出(在 Linux 上的 gdb 内部或外部):

程序因信号 SIGSEGV、分段错误而终止。该程序不再存在。

我可以检测到这实际上是堆栈溢出的唯一方法是通过 valgrind 运行程序。有什么办法可以强制操作系统转储调用堆栈跟踪,这将帮助我找到问题?

可悲的是,gdb 也不允许我轻松进入该程序。