2008-09-16 205 views
24

当您在同一台计算机上的可执行文件上执行通常的gdb会话时,可以给出运行命令,它将再次启动该程序。你如何开始在gdb中使用'target remote'重新运行程序?

当您在嵌入式系统上运行gdb时,与命令target localhost:3210'一样,如何在不退出并重新启动gdb会话的情况下重新启动程序?

回答

5

不幸的是,我不知道重新启动应用程序并仍然保持会话的方法。解决方法是将PC设置回程序的入口点。您可以通过调用做到这一点:

jump function

set $pc=address

如果您将参数消减为main,则可能需要重新设置它们。

编辑:

有几个与可能导致问题的上述方法需要注意的地方。

  • 如果你是在一个多线程程序跳转到主要将当前线程跳转到主,所有其他线程仍然存在。如果当前线程持有锁定,那么你有一些问题。内存泄漏,如果你编程的流程在初始化过程中分配了一些东西,那么你只是通过跳转泄漏了一堆内存。
  • 打开的文件仍然保持打开状态。如果您映射某些文件或地址,则通话很可能会失败。

所以,使用跳转与重新启动程序不是一回事。

+0

对于一个简单的非多线程应用程序,跳转正是我所需要的。 – wulfgarpro 2016-06-29 01:56:14

4

假设你在嵌入式系统上运行gdbserver。

你可以要求它重新启动,而不是与target extended-remote

+0

有用,目前没有关于目标扩展模式。谢谢。 – sstock 2009-07-31 01:09:14

2

“跳_start”退出你的程序是通常的方式。

0

如果您正在运行规律GDB你可以键入“运行”快捷“R”和gdb询问您是否要重新启动的程序

0

对我的方法描述在21.2 Sample GDB session startup的作品很棒。当我在“(gdb)”提示后输入monitor reset halt时,目标硬件将重置,我可以用c(= continue)重新启动应用程序。

在运行之间可以省略load命令,因为不需要一次又一次地刷新程序。

1

步骤一步过程

远程:

# 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的需要,但这种有以下烦恼:

通行证环境变量和更改工作目录,而不重新启动:How to modify the environment variables and working directory of gdbserver --multi without restarting it?

0

在EFM32快乐壁虎没有任何的建议都为我工作,所以这里是我从文档上集成GDB到Eclipse环境中学会了。

(gdb) mon reset 0 
(gdb) continue 
(gdb) continue 

这使我处于从IDE打到重置时的状态。

相关问题