如何使用“目标远程”在 gdb 中重新运行该程序?
题
当您在同一台计算机上的可执行文件上执行常规 gdb 会话时,您可以发出 run 命令,它将再次启动程序。
当您在嵌入式系统上运行 gdb 时,就像使用命令 target localhost:3210' 一样,如何在不退出并重新启动 gdb 会话的情况下重新启动该程序?
解决方案
其他提示
不幸的是,我不知道如何重新启动应用程序并仍然保持会话。解决方法是将 PC 设置回程序的入口点。您可以通过调用以下任一方法来执行此操作:
jump 功能
或者
set $pc=地址
.
如果你把论点混为一谈 main
您可能需要重新设置它们。
编辑:
上述方法有一些注意事项可能会导致问题。
- 如果您在多线程程序中跳转到main,则会将当前线程跳转到main,所有其他线程保持不变。如果当前线程持有锁......那么你就会遇到一些问题。
- 内存泄漏,如果您的程序流在初始化期间分配了一些东西,那么您只是在跳转时泄漏了一堆内存。
- 打开的文件仍将保持打开状态。如果您映射某些文件或地址,调用很可能会失败。
因此,使用跳转与重新启动程序不同。
假设您正在嵌入式系统上运行 gdbserver。
您可以要求它重新启动您的程序而不是退出 目标扩展远程
“jump_start”是通常的方式。
对我来说,中描述的方法 21.2 GDB 会话启动示例 效果很好。当我进入 monitor reset halt
稍后在“(gdb)”提示符处目标硬件被重置,我可以使用以下命令重新启动应用程序 c
(=继续)。
这 load
在运行之间可以省略命令,因为不需要一次又一次地刷新程序。
分步程序
偏僻的:
# pwd contains cross-compiled ./myexec
gdbserver --multi :1234
当地的:
# 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 参数传递给程序,如下所示:
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的环境变量和工作目录?
如果您正在运行常规 gdb,您可以输入“运行”快捷方式“r”,gdb 会询问您是否要重新启动程序
在 EFM32 Happy Gecko 上,所有建议都不适合我,因此以下是我从有关将 GDB 集成到 Eclipse 环境的文档中学到的内容。
(gdb) mon reset 0
(gdb) continue
(gdb) continue
这使我处于从 IDE 中点击重置时所期望的状态。