假设我想调试程序“Program.exe”的2个实例,每个实例都有不同的参数(“一”和“二”)。另外我需要同时运行两个进程(或者至少在 1 秒内)。
我读到 GDB 的劣势允许您在单个会话中运行和调试多个程序。这是我的尝试:
file Program.exe
set args one
add-inferior
inferior 2
file Program.exe
set args two
run
但没有成功。只有一个劣等者在运行
有什么想法吗? 我正在考虑这两个选择:
创建一个新的程序来fork该进程,然后GDB可以通过“set detach-on-fork off”来处理这两个进程,但这种方法在我看来有点丑陋......
正常启动两个进程,然后在GDB中通过PID附加它们。但我的环境是 Windows,我不知道该怎么做,也不知道如何通过命令行参数查找 PID。
提前致谢!
你的尝试几乎成功了,你只需要另外
starti
。启动每个进程后,可以使用单个 continue
来启动所有进程。
$ gdb
No symbol table is loaded. Use the "file" command.
(gdb) set schedule-multiple on
记得设置上面的,不然第二个
starti
会挂掉。
开始第一个下级。
(gdb) file bash
Reading symbols from bash...
(No debugging symbols found in bash)
(gdb) set args -c "echo one; sleep 1; echo three"
(gdb) starti
Starting program: /usr/bin/bash -c "echo one; sleep 1; echo three"
Program stopped.
0x00007ffff7fe52a0 in ?? () from /lib64/ld-linux-x86-64.so.2
添加并启动第二个下级。
(gdb) add-inferior
[New inferior 2]
Added inferior 2 on connection 1 (native)
(gdb) inferior 2
[Switching to inferior 2 [<null>] (<noexec>)]
(gdb) file bash
Reading symbols from bash...
(No debugging symbols found in bash)
(gdb) set args -c "sleep 0.5; echo two; sleep 1; echo four"
(gdb) starti
Starting program: /usr/bin/bash -c "sleep 0.5; echo two; sleep 1; echo four"
Thread 2.1 "bash" stopped.
0x00007ffff7fe52a0 in ?? () from /lib64/ld-linux-x86-64.so.2
继续两个下级。
(gdb) continue
Continuing.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
one
[Detaching after fork from child process 364313]
[Detaching after fork from child process 364314]
two
[Detaching after fork from child process 364315]
three
[Inferior 1 (process 364277) exited normally]
此时,inferior 1 停止,gdb 停止一切。如果您不喜欢这种行为,请参阅 https://stackoverflow.com/a/27163134/5267751 .
我们继续运行第二次未完成的任务。
(gdb) info inferior
Num Description Connection Executable
* 1 <null> /usr/bin/bash
2 process 364312 1 (native) /usr/bin/bash
(gdb) inferior 2
[Switching to inferior 2 [process 364312] (/usr/bin/bash)]
[Switching to thread 2.1 (Thread 0x7ffff7cda740 (LWP 364312))]
#0 0x00007ffff7e4e187 in wait4 () from /usr/lib/libc.so.6
(gdb) continue
Continuing.
four
[Inferior 2 (process 364312) exited normally]
(gdb)