GDB 無法執行我的測試程序
我的電腦執行 Ubuntu 14.04。GDB 在不同的帳戶中似乎異常。例如我做了一個非常簡單的測試。我在下面寫了一個文件
~/test/test.c
:#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("hello,world"); return 0; }
**並使用命令"gcc -g test.c -o test"**建構,然後我得到名為 test 的結果文件。下一步,執行 gdb 進行調試。請注意,目前帳戶是我自己的使用者。
$gdb test (gdb)l //work well (gdb) b 6 //work well (gdb) r //error: Cannot exec /home/xxx/test/test -c exec /home/xxx/test/test . //Error: No such file or directory
但如果我通過命令“su”更改為 root 帳戶,gdb 執行良好。為什麼?
看來您的 SHELL 變數設置為一個不存在的文件。嘗試以下操作:
export SHELL=/bin/sh gdb test
確保
/bin/sh
存在並且可執行。這su
不是因為 root 權限,而是因為su
重置了SHELL
環境變數。根據su 手冊頁:請注意,環境的預設行為如下:
這 $ HOME, $ 貝殼, $ USER, $ 日誌名稱, $ PATH, and $ IFS 環境變數被重置。
進一步討論
如果您問自己,“我應該如何從以下錯誤消息中知道這一點?”:
//error: Cannot exec /home/xxx/test/test -c exec /home/xxx/test/test . //Error: No such file or directory
你並不孤單。這似乎是來自
gdb
. 當gdb
決定它需要使用 shell 執行你的命令時,它會按照以下格式構造一個命令:/path/to/shell -c exec /path/to/executable
但是,當它列印錯誤消息時,它會這樣做:
save_errno = errno; fprintf_unfiltered (gdb_stderr, "Cannot exec %s", exec_file); for (i = 1; argv[i] != NULL; i++) fprintf_unfiltered (gdb_stderr, " %s", argv[i]); fprintf_unfiltered (gdb_stderr, ".\n"); fprintf_unfiltered (gdb_stderr, "Error: %s\n", safe_strerror (save_errno)); gdb_flush (gdb_stderr);
這
exec_file
是您在命令行中傳遞的文件的擴展路徑。它首先列印exec_file
,然後是 的元素argv
,從第一個索引開始。argv
包含它傳遞給的參數execvp
。不幸的是,它試圖使用的 shell 位於 的第 0 個元素中
argv
,它永遠不會被列印出來。因此,您永遠不會看到execvp
找不到的文件。此外,它然後列印一個尾隨
.
,它實際上不是它傳遞給的參數之一,execvp
並且可能在那裡使消息成為一個完整的句子。最後,它列印出我們從呼叫返回的錯誤
execvp
,即找不到執行檔。這個錯誤可能是由於這個錯誤處理程式碼對於
gdb
嘗試直接執行命令的情況和它使用 shell 的情況是相同的。在前一種情況下,構造的錯誤消息看起來是正確的,因為exec_file
並且argv[0]
將是相同的。