在gdb

2011-04-28 51 views
1

評估變量/功能我有以下代碼,在gdb

... 
char* seg = mmap(0, ...) 
printf("seg=%x\n", seg); 
... 

該程序打印與seg=b7ffd000。而在gdb(執行相同)時,使用p/x seg時,它會打印$2 = 0x0。我很困惑。是不是一樣var seg?爲什麼值不同。

PS:在mmap中,第一個參數是映射內存的優先地址,返回值是映射內存的實際地址。

+3

您是否在編譯時啓用了優化? – 2011-04-28 19:29:43

+0

是的,當-O3被移除時,問題就消失了。對原因感興趣。像哪個值是內存的真實地址,啓用了優化... – Richard 2011-04-28 21:00:31

回答

3

既然你已經在評論中回答了我的問題,我可以回答!

作爲printf的結果而看到的值是實際地址。在調試器中,您看到0的值爲seg,因爲啓用優化時,編譯器可以自由地執行各種奇怪的事情(這通常會使分步調試變得棘手)。雖然(假設你不依賴任何未定義的行爲),但「可觀察」的行爲應該總是正確的。