簡體   English   中英

gcc -g調試標志是否會影響程序執行?

[英]Does the gcc -g debugging flag affect program execution?

我剛剛測試了一個我正在工作的程序,當我用-g編譯它時,我發現它的執行速度提高了3μs(一個統計上顯着的變化)。 這對我來說毫無意義 - 我認為-g標志不應該影響程序執行,即使它確實這樣做也會使它運行得更慢,而不是更快。

誰能告訴我為什么會這樣? 它是否改變了程序的執行流程? 我沒有使用-O進行編譯,因為我需要它完全按照寫入執行,但是如果-g可以通過改變指令順序以某種方式使它運行得更快我顯然應該使用它。

所以我需要確切知道-g標志對程序的更改。

編輯:我運行的測試越多,t值越大(=差異變得越有統計意義)。 這絕對不是測量誤差 - 事情正在發生。

正如其他人所說,調試符號不會改變代碼的控制流,除非編譯器中存在(不太可能的)錯誤。

但是,它改變了執行,因為可執行文件變得更大,並且執行的代碼在更多頁面上更廣泛地傳播。 您可以預期更多緩存未命中和IO信號。 在多任務環境(甚至Linux / busybox系統就是這樣的事情)上,這可能導致稍微不同的調度行為。

另一方面,如你所描述的那樣,測量這種微小的時間差異本身就是一種藝術。 您可能處於海森堡環境中,測量會影響執行時間。 您的測量結果可能會顯示出統計上顯着的偏差,但我會非常小心地將它們解釋為這樣且此類選項會使代碼更快。

-g標志對實際生成的代碼進行0更改。 它的作用是為可執行文件添加調試部分。 這些部分不會在運行時加載,但調試器可以加載它們。 由於可執行文件現在有點不同,它更大 - 你可能會嘗試測量no。 在一個版本與另一個版本之間發生頁面錯誤的情況下,可執行文件存儲在磁盤上的方式會發生變化,但代碼沒有變化。

如果要查看程序集,請在二進制文件上運行objdump -d並進行比較

我確實質疑3us增加的有效性,可靠地測量3us,至少在通用操作系統上是一項艱巨的任務 - 我希望你運行你的程序幾千次(可能是幾十萬次)來用這個數字來試圖消除影響這種測量的所有隨機事物。

當我在其中一個子程序上使用-debug和-g標志時,我的代碼得到了不同的答案,所以雖然我不知道為什么,是的,它肯定會影響程序的執行。

暫無
暫無

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

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