![](/img/trans.png)
[英]IntelliJ / Android Studio - how to activate proguard to obfuscate code - step by step?
[英]Step In with native code leads to garbage in Android Studio
我有使用Android Studio中的Gradle构建的本机代码。 大多数调试似乎都可以在C ++中很好地进行,但是我只是添加了一个新类,当我尝试进入函数调用时,它将带我到一个完全无关的代码区域中,这是绝对荒谬的位置。
例如,我有以下带有断点的代码行:
SemVer ver_cl = PlatformHelper::getAppVersion();
我运行“ Step In”,最后在看似任意的代码行中实现了hashtable.h的gnu-libstdc++
实现。
我正在模拟器中运行。 我已经确保将我的项目同步到Gradle文件,但是我不确定是什么原因导致这种行为。
PlatformHelper::getAppVersion();
实现PlatformHelper::getAppVersion();
可以洞悉问题。 在这种特殊情况下,该方法没有返回值。 出于历史原因 ,它不是C ++中的错误,但是现代编译器通常会在这种情况下触发警告,并且通过为GCC添加-Werror
编译标志,可以强制将其视为错误。 当非void方法不返回值时,堆栈将被破坏,并且控制权将返回到随机位置。 aardvarkk很幸运,该地址是有效地址。
可以看到类似行为的另一种情况是使用优化(除-O0以外的任何其他代码)编译代码。 最强大的优化技术之一是内联:将函数体直接插入到调用它们的位置。 这对模板特别有用。 此过程的缺点是某些功能被完全消除,并且在堆栈跟踪中不可见。 因此,当您进入PlatformHelper::getAppVersion();
时,可能会出现这种情况PlatformHelper::getAppVersion();
您可以直接放到使用hashmap的内部某个地方,因为getAppVersion
调用和hashmap使用之间的所有代码都已被优化。 但是在这种情况下,您的程序将正常运行,仅调试会有些麻烦。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.