[英]Use GDB to debug a C++ program called from a shell script
我有一個極其復雜的 shell 腳本,它在其中調用我想通過 GDB 調試的 C++ 程序。 將這個 c++ 程序與 shell 分開是非常困難的,因為它有很多分支和很多環境變量設置。
有沒有辦法在這個 shell 腳本上調用 GDB? 看起來gdb
要求我直接調用 C++ 程序。
除了@diverscuba23 提到的選項之外,您還可以執行以下操作:
gdb --args bash <script>
(假設它是一個 bash 腳本。否則相應地進行調整)
您可以執行以下兩個選項:
直接在 shell 腳本中調用 GDB。 這意味着您沒有重定向標准輸入和標准輸出。
運行 shell 腳本,然后將調試器附加到已經運行的 C++ 進程,如下所示: gdb progname 1234
其中1234
是正在運行的 C++ 進程的進程 ID。
如果您需要在程序開始運行之前做一些事情,那么選項 1 將是更好的選擇,否則選項 2 是更簡潔的方法。
我可能會修改腳本以始終調用 gdb(並在稍后恢復)或添加一個選項來調用 gdb。 這幾乎總是最簡單的解決方案。
下一個最簡單的方法是臨時移動您的可執行文件並將其替換為在移動的程序上運行 gdb 的 shell 腳本。 例如,在包含您的程序的目錄中:
$ mv program _program
$ (echo "#!/bin/sh"; echo "exec gdb $PWD/_program") > program
$ chmod +x program
修改 c++ 應用程序以打印其 pid 並休眠 30 秒(可能基於環境或參數)。 使用 gdb 附加到正在運行的實例。
您可以暫時將gdb
添加到您的腳本中嗎?
盡管給出的答案是有效的,但有時您無權更改腳本以執行 gdb 或修改程序以添加附加輸出以通過 pid 附加。
幸運的是,還有另一種方式來發揮 bash 的威力
執行后,使用 ps、grep 和 awk 為您挑選 pid。 您可以通過用自己的腳本包裝其他腳本或僅自己執行命令來完成此操作。
該命令可能如下所示:
進程文件
#!/usr/bin/env bash
#setup for this example
#this will execute vim (with cmdline options) as a child to bash
#we will attempt to attach to this process
vim ~/.vimrc
要附加 gdb,我們只需要執行以下操作:
gdb --pid $(ps -ef | grep -ve grep | grep vim | awk '{print $2}')
ps -ef
這里列出的過程和他們的論點。 有時,您會運行一個程序的多個實例,並且需要進一步 grep 到您想要的那個grep -ve grep
存在是因為 ps 的f
選項將在其列表中包含下一個grep
。 如果您不需要額外過濾的命令參數,請不要在 ps 中包含-f
選項並忽略此部分grep vim
是我們找到所需進程的地方。 如果您需要更多過濾,您可以執行類似grep -E "vim.*vimrc"
並過濾到您嘗試附加到的進程awk '{print $2}'
只是將進程的 pid 輸出到標准輸出。 如果您使用ps -e
而不是ps -ef
請使用$1
我的正常設置是運行這樣的腳本,該腳本在 1 個 tmux 窗格中啟動我的進程,並在底部窗格中鍵入類似於上述內容的內容。 這樣,如果我需要調整過濾(無論出於何種原因),我都可以很快完成。
通常,對於特定實例,它是相同的,我想在它啟動后自動附加。 我將改為執行以下操作:
運行Gdb文件
#!/usr/bin/env bash
./process.sh &
PID=$(ps -ef | grep -ve grep | grep -E "vim.*vimrc" | awk '{print $2}')
#or
#PID=$(ps -e | grep vim | awk '{print $1}')
gdb --pid $PID
這假設原始進程可以安全地在后台運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.