3

https://stackoverflow.com/a/11467040/1442443からの質問

私の最終的な目標は、ユーザースペーススタックをダンプすることです。

私はAndroidプラットフォーム上の実行可能ファイルに以下のようにcppファイルを構築しようとします。したがって、tryToGetStack()を呼び出すことにより、実行時に実行可能ファイルの呼び出しスタックを取得できます。

#include <utils/CallStack.h>
namespace android
{
    extern "C" void tryToGetStack()
    {
        CallStack stack;
        stack.update();
        stack.dump("");
    }
}

CallStack.tppはlibutilsにあるため、Android.makにlib設定を追加します

LOCAL_SHARED_LIBRARIES + = libutils

しかし、私は常にメッセージでエラーが発生します:

エラー:「android :: CallStack :: CallStack()」への未定義の参照

エラー:「android :: CallStack :: update(int、int)」への未定義の参照

..。

実行可能ファイルは、実行時に.soファイルをロードするのではなく、リンク時にシンボルを解決するようです。何かが足りないのですか、それともAndroidビルドシステムに制限がありますか?

簡単な質問ですが、本当に助けが必要です...

update1

別の実行可能ファイルにコードを追加しようとしています。結果は同じです...Androidビルドシステムのルールを知っている人はいますか?

update2

私のコンソールには「targetStaticExecutable:...」というキーワードがいくつかありますが、それが答えだと思います。

http://en.wikipedia.org/wiki/Static_executable

4

4 に答える 4

6

私の最終的な目標は、ユーザースペーススタックをダンプすることです。

インターネットからの非常に多くの情報をグーグルした後、私は4つの方法があることに気づきました:

  1. ptrace: http: //en.wikipedia.org/wiki/Ptrace

    ptraceを使用するのは非常に難しいため、ptraceを使用してアタッチする前にスレッドを停止する必要があります。

  2. _unwind_backtrace:CallStackで使用される方法(CallStack.cppのCallStackクラス)

    例: http://git.stlinux.com/?p = stm / uclibc.git; a = blob; f = libubacktrace / sysdeps / sh / backtrace.c; h = 18b91b1bb3fa26344a521927c631553a410fcf56; hb = d6a3d9ece5922a337800a8e2ed4db7e

    これは欠点があります。スレッドがシグナルを処理しているときに使用すると、スレッドスタックをダンプするのではなく、シグナルスタックをダンプします。

    同じ問題:SIGSEGVで_Unwind_Backtraceを使用してfullstacktraceを取得する方法

  3. バックトレースhttp ://www.gnu.org/software/libc/manual/html_node/Backtraces.html

    GNU拡張関数。Androidで使用されるBioniclibcには実装されていません。

    参照:https ://stackoverflow.com/a/8295238/1442443

    参照: http: //lists.puredata.info/pipermail/pd-list/2012-02/094258.html

  4. ユーザースペースのスレッドスタックをダンプするパッチhttp ://www.gossamer-threads.com/lists/linux/kernel/1525096

    ただし、X86アーキテクチャでのみ実装されます... orz

    私はそれをAndroidに移植しようとしましたが、armはフレームポインタを使用しないため、スタックの最初のフレームのみが表示されます。

だから...2が答えです。

ただし、誰かが問題を解決できるかどうか疑問に思います:SIGSEGVで_Unwind_Backtraceを使用してfullstacktraceを取得する方法

アップデート:

クロスコンパイラを使用してglicを使用してコードをコンパイルできる場合は、3。backtraceを使用できます。 http://communities.mentor.com/community/cs/archives/arm-gnu/msg02514.html

update2 良い記事

http://codingrelic.geekhold.com/2009/05/pre-mortem-backtracing.html

于 2012-07-18T09:30:02.503 に答える
2

これはとても重要な質問なので、ここで私のために働いた私の答えがあります。私のコードはCであるため、android::CallStackにアクセスできるC++関数を呼び出す必要があります。

stackdump.cpp:

#include < utils/CallStack.h >
extern "C" void dumpCallStack( char *label)
{
   android::CallStack cs;
   cs.update();
   cs.dump(label);
}

私のメインコード(foo.c):

void dumpCallStack(char *label);

...

dumpCallStack(\__FUNCTION__);
于 2014-01-19T03:25:42.987 に答える
0

私は一度同じ問題を抱えていました。そして、解釈するのは難しいです。

もちろん、構文は正しく、合理的です。

私は多くの方法を試しましたが、うまくいきませんでした。

最後に、lib参照 "LOCAL_SHARED_LIBRARIES + = libutils"は、静的ライブラリを生成するmakefileではなく、動的ライブラリを生成するmakefileに配置する必要があるという考えを思いつきました。これが最後の理由です。

参照: http: //yongbingchen.github.io/blog/2013/05/09/dump-stack-in-android-native-c-code/

于 2014-02-28T09:32:52.353 に答える
0

このエラーも受け取りましたが、次のように追加しました。

LOCAL_STATIC_LIBRARIES += libutils 

3つのターゲットのラインの前にLOCAL_MODULE := xxx追加されましたvm/Android.m

LOCAL_SHARED_LIBRARIES += libcorkscrew

vm/Android.mk

およびlibdex/Android.mk、および、、についても同じですdexlist/Android.mkdexdump/Android.mk

これらすべてが行われた後、それは私のために働きます。

于 2017-07-30T15:55:19.893 に答える