当您在同一台计算机上的可执行文件上执行常规gdb会话时,您可以执行run命令,它将重新启动该程序。
当您在嵌入式系统上运行gdb时,与命令target localhost:3210'一样,如何在不退出并重新启动gdb会话的情况下重新启动程序?
答案 0 :(得分:10)
答案 1 :(得分:6)
不幸的是,我不知道如何重启应用程序并仍然维护会话。解决方法是将PC设置回程序的入口点。您可以通过以下方式执行此操作:
jump function
或
set $pc=address
。
如果您将参数发送到main
,则可能需要重新设置它们。
编辑:
上述方法有一些注意事项可能会导致问题。
因此,使用jump与重新启动程序不同。
答案 2 :(得分:4)
据推测,您正在嵌入式系统上运行gdbserver。
您可以要求它重新启动您的计划,而不是退出target extended-remote
答案 3 :(得分:2)
“jump _start”是通常的方式。
答案 4 :(得分:2)
对我来说,21.2 Sample GDB session startup中描述的方法效果很好。当我稍后在“(gdb)”提示符处输入monitor reset halt
时,目标硬件将重置,我可以使用c
重新启动应用程序(=继续)。
运行之间可以省略load
命令,因为不需要一次又一次地刷新程序。
答案 5 :(得分: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
的需求,但这有以下烦恼:
show args
上,并且不会在重新启动后保留:https://sourceware.org/bugzilla/show_bug.cgi?id=21980 传递环境变量并更改工作目录而不重启:How to modify the environment variables and working directory of gdbserver --multi without restarting it?
答案 6 :(得分:0)
如果你正在运行常规gdb,你可以输入'run'快捷键'r',gdb会询问你是否要重启程序
答案 7 :(得分:0)
在EFM32上,Happy Gecko没有任何建议对我有用,所以这里是我从关于将GDB集成到Eclipse环境的文档中学到的。
(gdb) mon reset 0
(gdb) continue
(gdb) continue
这使我处于从IDE进行重置时我所期望的状态。
答案 8 :(得分:0)
您可以使用 jump
gdb 命令。为此,您可以检查您的 startup
脚本。
我的 startup script
有一个符号。
.section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
ldr r0, =_estack
mov sp, r0 /* set stack pointer */
我想跳过去。这就是我使用的原因:
jump Reset_Handler