簡體   English   中英

gdb 正在意外行設置斷點

[英]gdb is setting a breakpoint at an unexpected line

1       #include <stdio.h>
2       int main()
3       {
4       int i;
5       for (i=0; i<=10; i++)
6               {
7                       puts("Hello world\n");
8               }
9               return 0;
10              //test
         }

我正在嘗試使用 gdb 調試上面的代碼。我面臨的問題是,當我使用命令break main時,它在第 5 行設置斷點,而不是在第 2 行設置斷點。 下面是我得到的 output:

(gdb) break main
Breakpoint 1 at 0x555555555141: file firstprogram.c, line 5.

我原以為斷點會設置在第 2 行而不是第 5 行。

您只能在有指令的地址處設置斷點。

看看你的編譯器是如何把這個 C function 變成 asm. (例如,在使用當前 GCC/clang 的Godbolt目標 Linux 上。)

在 GCC 或 clang output 中,有或沒有優化,都有針對 function 序言的說明(分別壓入調用保留寄存器或使用幀指針制作堆棧幀)。 GCC 和 clang 生成的調試信息將這些指令與開頭{相關聯,第 3 行。

(Godbolt 編譯器資源管理器的顏色語法突出顯示和鼠標懸停突出顯示基於編譯器生成的調試信息,在將源代碼行映射到/從地址時使用相同的信息 GDB。)

function 主體中任何內容的第一條指令要么是未優化版本中的i=0 ,要么是循環主體中的mov edi, OFFSET FLAT:.LC0 / call puts

(GCC/clang 認為mov ebx, 11 loop counter init 與源代碼行無關,因為在優化之后他們已經將循環轉換為 11 次迭代的遞減計數到零。那個 mov-to-register 指令是function 序言,根據調試信息。)

暫無
暫無

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

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