在Android 4.4.2上使用LD_PRELOAD

时间:2015-04-13 17:11:45

标签: android multithreading android-ndk shared-libraries gprof

我有一个Android应用程序使用多个本机pthreads,我需要调试。我看到的唯一明智的选择是使用基于gprof的android-ndk-profiler。但是,not work properly with multithreading知道gprof。很高兴,有一个work-around by Sam Hocevar可用于包装pthread以允许gprof对多线程应用程序进行适当的分析。

现在,他们建议使用LD_PRELOAD在库到配置文件之前加载libgprofhelper.so。这对我不起作用。

我决定选择一个非常简单的测试,在我的库到配置文件中有一个函数,称之为libtoProfile.so:

void printDummy()
{
    __android_log_print(ANDROID_LOG_FATAL, "SomeTag", "Hello World!");
}

我使用Android NDK r10d为armeabi-v7a编译了这个。 objdump -T libtoProfile.so | grep printDummy

00113cf9 g    DF .text  0000001c printDummy 

文件libtoProfile.so 表示

libavNative.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped

现在我创建了我的库libgprofhelper.so,它应该影响libtoProfile.so中的printDummy()函数。它有非常相似的代码:

void printDummy()
{
    __android_log_print(ANDROID_LOG_FATAL, "SomeTag", "Successfully overshadowed!");
}

它使用完全相同的设置/标志/编译器和相同的架构(armeabi-v7a)构建。

libgprofhelper.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /system/bin/linker, stripped

objdump -T libgprofhelper.so | grep printDummy

 00000c39 g    DF .text  00000018 printDummy

到目前为止,这对我来说似乎很好。

我有一个运行Android 4.4.2的HTC One M7。我使用 adb push libgprofhelper.so /data/libgprofhelper.so 来获取我的设备上的库。

然后我使用libtoProfile.so手动安装应用程序,该软件包的名称为 av.profiling

然后我发出

root@m7:/ # setprop wrap.av.profiling "LD_PRELOAD=/data/libgprofhelper.so"     

创建以下条目

130|root@m7:/ # getprop | grep profiling
[wrap.av.profiling]: [LD_PRELOAD=/data/libgprofhelper.so]

然而,当我启动我的应用程序时(通过Launcher或通过 am start -n ... )我看不到它在logcat中尝试加载libgprofhelper.so的任何迹象,也不是所希望的输出那里。该应用程序只是说" Hello World!",这意味着LD_PRELOAD根本没有效果。

有人知道LD_PRELOAD是否在Android 4.4.2上按预期工作,或者有任何不同的方法来追踪我的错误位置?当然,也欢迎使用其他方法来分析多本机线程的CPU使用情况。

0 个答案:

没有答案