2016-10-13 57 views
0

我有我在Android Studio中使用Gradle構建的本機代碼。大多數調試似乎在C++中工作正常,但我只是添加了一個新類,當我嘗試進入函數調用時,它將我帶到一個完全不相關的代碼區域中的絕對奇怪的位置。使用本機代碼導致Android Studio中出現垃圾

例如,我有下面的代碼符合斷點:

SemVer ver_cl = PlatformHelper::getAppVersion();

我跑「工序在」,我在gnu-libstdc++實施hashtable.h的結束在一個看似任意的代碼行。

我在模擬器中運行。我已經確定將我的項目同步到Gradle文件,但我不確定可能會導致這種行爲。

回答

2

執行PlatformHelper::getAppVersion();可以提供有關該問題的信息。在這種特殊情況下,它發生該方法沒有返回值。對於historical reasons,它不是C++中的錯誤,但現代編譯器通常會在這種情況下觸發警告,並通過爲GCC添加編譯標誌,您可以強制它將警告視爲錯誤。當非void方法沒有返回值時,堆棧被破壞,控制權返回到隨機地點。 aardvarkk是「幸運的」,說這個地址是一個有效的地址。

可以看到類似行爲的另一種情況是當您使用優化編譯代碼時(除了-O0以外的任何其他情況)。最強大的優化技術之一是內聯:函數體直接插入到被調用的地方。這對模板特別有用。這個過程的缺點是一些功能被完全消除,並且在堆棧跟蹤中不可見。所以有可能當你步入PlatformHelper::getAppVersion();時,你直接掉到了它的內部,因爲所有在調用getAppVersion和哈希映射使用之間的代碼都被優化掉了。但是在這種情況下,你的程序會正常工作,只有調試纔會有一點困難。

+0

我不相信這是怎麼回事。函數體實際上不包含任何內容 - 只是一行說:'int n = 0;'所以我可以看到它是否落在它的內部。這就是說,我現在正在意識到我現在實際上並沒有返回一個SemVer結構體,並且出於某種原因,編譯器並沒有抱怨這種情況?!看起來很奇怪...... – aardvarkk

+1

編譯器確實沒有抱怨沒有從函數返回值。在這種情況下,當你從函數返回時,你的堆棧被破壞,事情可能會變得很奇怪。 –

+0

哦,人 - 這完全就是我沒有從函數中返回有效值。我習慣這是一個編譯器錯誤 - 我沒有想到那種隨機行爲。我會贊成答案。如果你想編輯你的答案,以便它與「實際」解決方案相關,我也會將其標記爲答案。謝謝你的幫助! – aardvarkk

相關問題