如何从 gdb 中自动重新附加到由 valgrind 控制的进程?
How to automatically reattach to a process controlled by valgrind from within gdb?
我犯了一个很难调试的内存错误,每隔几个命令行 运行 就会发生一次,每次大约需要两个小时才能完成。因此,我认为创建这样的日志可能是个好主意:
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
,这将 运行 第一个错误然后停止。然后你可以附加一个调试器。
我犯了一个很难调试的内存错误,每隔几个命令行 运行 就会发生一次,每次大约需要两个小时才能完成。因此,我认为创建这样的日志可能是个好主意:
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
,这将 运行 第一个错误然后停止。然后你可以附加一个调试器。