繁体   English   中英

介入本机代码会导致Android Studio中的垃圾

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM