2009-09-01 56 views
0

我正在編寫/調試使用大量C++進行圖像處理的iPhone項目。當我在Xcode下使用gdb時,我遇到了麻煩,因爲每當我打印值時,它們都完全不符合真正的值(比較
cout << "width" << width << endl;打印出320,如果我在gdb中做了
print width
,我得到值像805300460)使用C++在Xcode GDB中打印不能打印正確的值

我猜測這是gdb的問題,而不是程序,因爲我不認爲我覆蓋內存和打印到標準輸出的值似乎是正確的。該語言被自動設置爲C++。

看着這個Apple GDB doc好像添加這個編譯器標誌可能有助於-gdwarf-2?不知道在哪裏做。

有人遇到這個問題?有什麼想法?

回答

1

在快速刺中,您使用了哪些優化?如果你使用的是一些,那麼值就會被保存在一個寄存器中,而不是被寫入內存,所以你會得到任何內存中的值。在這種情況下,你會通過iostream得到正確的答案,因爲編譯器必須使可觀察的行爲與語言所說的內容相匹配,但是gdb看起來在幕後。

+0

在項目>編輯項目設置>構建>優化級別下,它被設置爲「最快,最小」[-Os]。我將它改爲無[-O0],仍然沒有運氣。儘管謝謝你的回答! – Andres 2009-09-01 15:05:43

1

在gdb的嘗試:

p /d width 

也許編碼是不同的。

我不認爲「矮人」params會幫助。 Dwarf params在編譯過程中使用源代碼描述中間代碼。 基本上他們試圖在編譯階段保留源代碼。 在gdb中,它允許您將源代碼中的行號與二進制語句相匹配。 這個問題不應該與變量有關。

+0

也嘗試過,但沒有運氣:(。謝謝你的建議!如果你能想到其他的東西,請告訴我! – Andres 2009-09-01 15:06:36

+0

試一試C++: int a 12345; ..cout << hex << a << endl; 而這在gdb: p/x a 它應該返回相同的值。 – name 2009-09-01 16:24:49

+0

它返回不同的值。 int a = 1234; cout << hex << a << endl;打印出4d2 p/x a打印出0x0(不是很好的符號)。 我試過未經修改的開源項目,它似乎工作正常,所以它似乎是某種設置。有沒有辦法在Xcode中重置gdb設置? – Andres 2009-09-01 21:57:55

0

在使用下列GDB版本我有一個類似的問題:

的i686-蘋果darwin9-G ++ - 4.0.1(GCC)4.0.1(蘋果公司建立5493) 版權所有( C)2005自由軟件基金會,公司

我瞭解到,這個問題可能這個GCC編譯器的問題是由於:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44731

這可能是您所遇到的,如果您打印的值也被用作函數的返回值。

在我的情況下,該程序是一個正確運行的程序。該問題完全與優化有關,即使構建集爲「零優化」,也與二進制文件中不正確的調試信息有關。但程序本身運行良好。