关于嵌入式:您如何使用“目标远程”在gdb中重新开始运行该程序?

关于嵌入式:您如何使用“目标远程”在gdb中重新开始运行该程序?

How do you start running the program over again in gdb with 'target remote'?

在同一台计算机上的可执行文件上执行常规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会询问您是否要重新启动该程序


推荐阅读