在同一台计算机上的可执行文件上执行常规gdb会话时,可以给出run命令,它将再次重新启动程序。
当您在嵌入式系统上运行gdb时,如命令target localhost:3210'一样,如何在不退出并重新启动gdb会话的情况下重新启动该程序?
您正在寻找gdbserver和set remote exec-file filename的多进程模式
不幸的是,我不知道一种重新启动应用程序并仍然保持会话状态的方法。解决方法是将PC设置回程序的入口点。您可以通过以下方式进行操作:
jump function
要么
set $pc=address。
如果您修改了main的参数,则可能需要再次设置它们。
编辑:
上述方法有两个警告,可能会引起问题。
-
如果您在多线程程序中,则跳转到main会将当前线程跳转到main,所有其他线程都将保留。如果当前线程持有锁...那么您将遇到一些问题。
-
内存泄漏,如果您的程序流在初始化期间分配了一些东西,那么您只是在跳转时泄漏了一些内存。
-
打开的文件仍将保持打开状态。如果您映射某些文件或地址,则呼叫很可能会失败。
因此,使用跳转与重新启动程序不同。
大概您正在嵌入式系统上运行gdbserver。
您可以要求它重新启动程序,而不用目标扩展远程退出
对我来说,在21.2示例GDB会话启动中描述的方法非常有用。当我稍后在"(gdb)"提示符下输入monitor reset halt时,目标硬件已重置,我可以使用c重新启动应用程序(=继续)。
在运行之间可以省略load命令,因为不需要一次又一次地刷新程序。
"跳转_开始"是通常的方法。
分步程序
远程:
1 2
| # pwd contains cross-compiled ./myexec
gdbserver --multi :1234 |
本地:
1 2 3 4 5 6 7 8 9
| # pwd also contains the same cross-compiled ./myexec
gdb -ex 'target extended-remote 192.168.0.1:1234' \
-ex 'set remote exec-file ./myexec' \
--args ./myexec arg1 arg2
(gdb) r
[Inferior 1 (process 1234) exited normally]
(gdb) r
[Inferior 1 (process 1235) exited normally]
(gdb) monitor exit |
在Ubuntu 14.04中测试。
也可以通过以下方式将CLI参数传递给程序:
1
| gdbserver --multi :1234 ./myexec arg1 arg2 |
并且./myexec部分消除了对set remote exec-file ./myexec的需要,但这具有以下烦恼:
-
未记录:https://sourceware.org/bugzilla/show_bug.cgi?id=21981
-
不会显示在show args上,并且不会在重新启动后持续存在:https://sourceware.org/bugzilla/show_bug.cgi?id=21980
传递环境变量并更改工作目录而不重新启动:如何在不重新启动的情况下修改gdbserver --multi的环境变量和工作目录?
在EFM32 Happy Gecko上,没有任何建议对我有用,因此这是我从将GDB集成到Eclipse环境中的文档中学到的。
1 2 3
| (gdb) mon reset 0
(gdb) continue
(gdb) continue |
这使我处于从IDE重置时的预期状态。
如果您运行的是常规gdb,则可以键入"运行"快捷方式" r",gdb会询问您是否要重新启动该程序