2016-10-13 5 views
0

Android StudioでGradleを使用して作成したネイティブコードがあります。デバッグの大部分はC++でうまく動作しているようですが、新しいクラスを追加したばかりですが、関数呼び出しに踏み込もうとすると、まったく無関係なコード領域で私は奇妙な場所に連れて行きます。ステップインでネイティブコードを使用すると、Androidスタジオでゴミが発生する

例えば、私はブレークポイントと次のコード行を有する:

SemVer ver_cl = PlatformHelper::getAppVersion();

を私が「ステップ」を実行し、私は一見、任意にhashtable.hのgnu-libstdc++実装で終わりますコード行

私はシミュレータで動作しています。私は自分のプロジェクトをGradleファイルに同期させるようにしましたが、何がこの種の動作を引き起こしているのかは分かりません。

答えて

2

PlatformHelper::getAppVersion();の実装は、問題の洞察を与えることができます。この特定のケースでは、メソッドに戻り値がないことが発生しました。 historical reasonsについては、C++ではエラーではありませんが、現代のコンパイラは通常このような状況では警告をトリガーし、GCC用のコンパイルフラグ-Werrorを追加すると、警告をエラーとして扱うことができます。非voidメソッドが値を返さない場合、スタックは破損し、コントロールはランダムな場所に返されます。 aardvarkkはアドレスが有効なものであることが「幸い」であった。

同様の動作が見られる別の状況は、最適化(-O0以外のもの)でコードをコンパイルするときです。最も強力な最適化手法の1つはインライン展開です。関数本体は、呼び出された場所に直接挿入されます。これは特にテンプレートに適しています。このプロセスの欠点は、一部の機能が完全に削除され、スタックトレースに表示されないことです。したがって、PlatformHelper::getAppVersion();に入ると、getAppVersionの呼び出しとhashmapの使用の間のすべてのコードが最適化されているため、hashmapが使用されている内部のどこかに直接ドロップする可能性があります。しかしこの場合、あなたのプログラムは正しく機能し、デバッグはちょっと分かりません。

+0

私はこれが起こっているとは思わない。関数本体には実際には何も含まれていません。 'int n = 0;'という行だけです。その内部に着地しているかどうか確認できます。つまり、私は今、実際にSemVer構造体を現時点で返さないことを認識しています。何らかの理由でコンパイラがそれについて不平を言っていませんか?変わったと思われる... – aardvarkk

+1

コンパイラは実際に関数から値を返さないことについて不平を言うことはありません。そしてそのような場合には、関数から戻るときにスタックが壊れてしまい、事態が本当に変わってしまうかもしれません。 –

+0

ああ、私は関数から有効な値を返さなかっただけです。私はそれがコンパイルエラーであることに慣れています - 私はそのようなランダムな動作を期待していませんでした。私は答えをアップアップします。 「実際の」ソリューションに関連するように回答を編集したい場合は、回答としてマークします。ご協力いただきありがとうございます! – aardvarkk

関連する問題