簡體   English   中英

沒有符號的調試?

[英]Debugging without symbols?

我有應該失敗的 simple.c 文件(我知道它失敗的地方,我故意將錯誤放在那里):

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fprintf(stderr, "Usage: %s argument\n", argv[0]);
    return EXIT_FAILURE;
  }

  char *hello = "hello";
  *hello = 'H';

  fprintf(stdout, "%s, %s!\n", hello, argv[1]);

  return EXIT_SUCCESS;
}

第 1 部分)我將其保存為“hello.c”,並通過gcc hello.c -o hello在不帶調試標志的情況下進行編譯。

然后,我希望 go 一行一行地通過主 function。 我嘗試使用 gdb 如下:

  1. 運行gdb./hello

  2. 通過break main設置斷點

  3. 運行run 123

  4. s -> 失敗

結果如下:

(gdb) info func
All defined functions:

Non-debugging symbols:
0x0000000000000568  _init
0x0000000000000590  fprintf@plt
0x00000000000005a0  __cxa_finalize@plt
0x00000000000005b0  _start
0x00000000000005e0  deregister_tm_clones
0x0000000000000620  register_tm_clones
0x0000000000000670  __do_global_dtors_aux
0x00000000000006b0  frame_dummy
0x00000000000006ba  main
0x0000000000000740  __libc_csu_init
0x00000000000007b0  __libc_csu_fini
0x00000000000007b4  _fini
(gdb) break main
Breakpoint 1 at 0x6be
(gdb) r
Starting program: /mnt/c/Users/User/Documents/Debugging/hello

Breakpoint 1, 0x00000000080006be in main ()
(gdb) s
Single stepping until exit from function main,
which has no line number information.
__fprintf (stream=0x7fffff3ec680 <_IO_2_1_stderr_>, format=0x80007c4 "Usage: %s argument\n") at fprintf.c:27
27      fprintf.c: No such file or directory.

為什么會這樣? 為什么通過嘗試查找文件 fprintf 會失敗? 認為預處理的標頭應該處理所需的實現代碼。

第 2 部分)當我使用-g進行編譯時,它出於某種原因工作。 但是在 gdb 中運行程序不會產生預期的分段錯誤:/ 為什么?

再次,請參閱:

$ ./hello 123
Segmentation fault (core dumped)

(gdb) run 123
Starting program: /mnt/c/Users/NichlasDesktop/Documents/uni/Compsys/Exercises/Debugging/exercise_code/hello 123
Hello, 123!
[Inferior 1 (process 632) exited normally]

第1部分)

s -> fails

在沒有調試信息的情況下, gdb無法將 map 指令轉為源代碼——文件路徑和行號。 s / step命令告訴gdb執行與源語言中的當前語句相對應的指令。 gdb無法告訴它是什么,所以它一直持續到代碼中的任何地方,源 position(“SPOS”)信息可用。 這恰好在定義 fprintf 的 libc 中。 但是 fprintf 的源代碼在您的環境中不可用,因此該消息。

您可以使用si / stepi命令逐步執行各個指令,這不需要存在調試信息。

您沒有顯示如果從該點繼續執行會發生什么,我懷疑它最終會遇到分段錯誤。

為什么會這樣? 為什么通過嘗試查找文件 fprintf 會失敗? 認為預處理的標頭應該處理所需的實現代碼。

那不是標題。 它們不包含源代碼。

第 2 部分)當我使用 -g 編譯時,它出於某種原因工作。 但是在 gdb 中運行程序不會產生預期的分段錯誤:/ 為什么?

gdb或任何其他調試器將安排將可執行文本段映射為私有而不是像通常的運行情況那樣共享(使用MAP_PRIVATE而不是MAP_SHAREDmmap )。 這是因為調試器需要文本段是可寫的,以便可以覆蓋指令以插入斷點等。

您輸入的“hello”是一個常量字符串文字,存儲在可執行文件的只讀文本段中。 這就是為什么在正常運行期間寫入它會導致分段錯誤 - 文本段被映射共享。 然而,在調試器內部,文本段被映射為私有的,因此您可以對其進行寫入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM