2008-09-16 21 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打到重置時的狀態。

相關問題