gdb優化相關

2021-07-09 03:07:48 字數 1004 閱讀 8738

gdb除錯的時候經常會遇到這種問題:

#>in main (argc=optimized out>, argv=optimized out>)
產生這個問題的原因是什麼了?

這其實是gcc編譯優化造成的。

在makefile檔案的gcc編譯選項從-ox 變為 -o0。(一般情況下-ox可能是-o2,3,4等,主要是為了加快編譯的速度而設定成這樣,如果是0表示不優化,gdb將會識別所有的標記)

-o設定一共有五種:-o0、-o1、-o2、-o3和-os。

除了-o0以外,每乙個-o設定都會多啟用幾個選項,請查閱gcc手冊的優化選項章節,以便了解每個-o等級啟用了哪些選項及它們有何作用。

各個優化等級如下:

-o0:這個等級(字母「o」後面跟個零)關閉所有優化選項,也是cflags或cxxflags中沒有設定-o等級時的預設等級。這樣就不會優化**,這通常不是我們想要的。

-o1:這是最基本的優化等級。編譯器會在不花費太多編譯時間的同時試圖生成更快更小的**。這些優化是非常基礎的,但一般這些任務肯定能順利完成。

-o2:-o1的高階。這是推薦的優化等級,除非你有特殊的需求。-o2會比-o1啟用多一些標記。設定了-o2後,編譯器會試圖提高**效能而不會增大體積和大量占用的編譯時間。

-o3:這是最高最危險的優化等級。用這個選項會延長編譯**的時間,並且在使用gcc4.x的系統裡不應全域性啟用。自從3.x版本以來gcc的行為已經有了極大地改變。在3.x,-o3生成的**也只是比-o2快一點點而已,而gcc4.x中還未必更快。用-o3來編譯所有的軟體包將產生更大體積更耗記憶體的二進位制檔案,大大增加編譯失敗的機會或不可預知的程式行為(包括錯誤)。這樣做將得不償失,記住過猶不及。在gcc 4.x.中使用-o3是不推薦的。

-os:這個等級用來優化**尺寸。其中啟用了-o2中不會增加磁碟空間占用的**生成選項。這對於磁碟空間極其緊張或者cpu快取較小的機器非常有用。但也可能產生些許問題,因此軟體樹中的大部分ebuild都過濾掉這個等級的優化。使用-os是不推薦的。

gdb除錯相關

3.2.1 斷點的工作原理 在本書的所有地方都使用了status breakpoint異常,尤其是在本章中,但卻沒有很明確地解釋這個異常的引發方式。現在,我們就來解釋如何在程序中產生這個異常。在x86指令集中包含了乙個特殊的指令int 3,這個指令將在處理器上產生硬體中斷status breakpo...

gdb除錯相關

core檔案用於gdb除錯比較有用 你可以用 ulimit a 看一下core file size 如果是0,可以用ulimit c unlimited 來指定大小不限,或者指定固定的大小 採用automake方式時,要在makefile.am中加入 xx ldflags static libtoo...

gdb除錯相關指令

the gnu project debugger 1編譯2開啟gdb,設定相關斷點 r 或run 執行,前提是先要把斷點設定好 n 或next 下一步。c 或continue 執行至斷點,沒斷點就執行至結束 s 或step 進入函式體內部,不能進入就單步,可看見函式引數值,l 可看函式 b可增加斷點...