我有在 Android Studio 中使用 Gradle 构建的 native 代码。大多数调试在 C++ 中似乎工作正常,但我只是添加了一个新类,当我尝试介入函数调用时,它会将我带到一个完全不相关的代码区域中的一个绝对奇怪的位置。
例如,我有以下带有断点的代码行:
SemVer ver_cl = PlatformHelper::getAppVersion();
我运行“Step In”,最后在看似任意的代码行上执行 hashtable.h 的 gnu-libstdc++
实现。
我在模拟器中运行。我已确保将我的项目同步到 Gradle 文件,但我不确定是什么导致了这种行为。
最佳答案
实现PlatformHelper::getAppVersion();
可以洞察问题。在这种特殊情况下,该方法没有返回值。对于 historical reasons ,这在 C++ 中不是错误,但现代编译器通常会在这种情况下通过添加 -Werror
来触发警告。 GCC 的编译标志,您可以强制它将警告视为错误。当非 void 方法不返回值时,堆栈被破坏并且控制返回到随机位置。 aardvarkk 很“幸运”地发现地址是有效的。
可以看到类似行为的另一种情况是当您使用优化编译代码时(除了 -O0 之外的任何东西)。最强大的优化技术之一是内联:函数体被直接插入到它们被调用的地方。这对模板特别有用。这个过程的缺点是一些功能被完全消除并且它们在堆栈跟踪中不可见。所以有可能当你进入PlatformHelper::getAppVersion();
您直接将其放入使用 hashmap 的内部结构中的某个位置,因为调用 getAppVersion
之间的所有代码并且 hashmap 的使用已被优化掉。但是在这种情况下你的程序会正常运行,只是调试会有点麻烦。
关于android - 使用 native 代码进入会导致 Android Studio 中出现垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028910/