linux - 如何从 gdb 中自动重新连接到由 valgrind 控制的进程?

标签 linux segmentation-fault gdb valgrind

我犯了一个很难调试的内存错误,在几次命令行运行中每隔一次就会发生一次,每次运行大约需要两个小时才能完成。因此,我认为创建这样的日志可能是一个好主意:

while true; do 
  valgrind ./command 2>&1 | tee command
  grep -q Invalid && break
done

问题是我的调试日志和 Valgrind 生成的堆栈跟踪还不够,所以我决定将 --vgdb-error=0 添加到命令行。不幸的是,由于 Valgrind 现在在启动时添加了一个断点,我需要运行以下命令:

$ gdb ./command
...gdb init string follows...
(gdb) target remote | /usr/lib/valgrind/../../bin/vgdb
Remote debugging using | /usr/lib/valgrind/../../bin/vgdb
relaying data between gdb and process 4361
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
[Switching to Thread 4361]
0x04000840 in ?? () from /lib/ld-linux.so.2
(gdb) continue
Continuing.

如何编写该进程的脚本,以便 Valgrind 在启动时不会中断,或者脚本继续附加到 vgdb 进程并告诉它们继续,直到其中一个进程异常完成?

最佳答案

--vgdb-error 的参数是 valgrind 停止程序并附加调试器之前预期的错误数。如果将其设置为0,那么它将在运行程序之前立即停止。您需要 --vgdb-error=1,它将运行到第一个错误然后停止。然后您可以附加调试器。

关于linux - 如何从 gdb 中自动重新连接到由 valgrind 控制的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31165892/

相关文章:

python - 如何安装 Rust 而不会在文件下载过程中出现超时错误?

linux - 为什么我的线程化 Perl 脚本会出现段错误?

C 指针段错误崩溃

c - 从 struct can_frame 的选项卡中检索十六进制 argv[]

c++ - 在 Debug模式下调用函数时,GDB 崩溃

c - gdb 查找行号的内存地址

android - 在 native 库中使用 AInputQueue_attachLooper()

linux - Docker 加载代理环境变量失败

c - pthread_setname_np() 设置功能时

c - 在 gdb 中打印十六进制值时打印前面的 0