Shell

GDB 無法執行我的測試程序

  • June 21, 2018

我的電腦執行 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]將是相同的。

引用自:https://unix.stackexchange.com/questions/167918