我想在发生某些事件时转储堆栈,因此我将脚本编写到init.rc 中,如下所示。然后我使用setprop dump_stack 0和setprop dump_stack 1来操纵它,但我的控制台中没有输出?
on property:dump_stack=1
exec /system/bin/cat /proc/100/stack # pid = 100
Run Code Online (Sandbox Code Playgroud)
我在 system\core\init\builitins.c 中添加了一些日志,它说代码有效(retstatus 为 0)。即使我将脚本更改为“exec /system/bin/cat /proc/100/stack > /data/temp”,它仍然不起作用。那么,init.rc(init进程)的输出在哪里呢?
附注。我将脚本写入 init.rc 的原因是“权限”。init 进程是 root,所以它可以转储其他进程的堆栈。
而且,语法是否正确?我在http://www.kandroid.org/online-pdk/guide/bring_up.html 中通过Android Init Language编写了“exec /system/bin/cat /proc/100/stack”
我的最终目标是转储用户空间堆栈。
我尝试将以下cpp文件构建为android平台上的可执行文件。因此,通过调用tryToGetStack(),可以在运行时获取可执行文件的调用堆栈。
#include <utils/CallStack.h>
namespace android
{
extern "C" void tryToGetStack()
{
CallStack stack;
stack.update();
stack.dump("");
}
}
Run Code Online (Sandbox Code Playgroud)
并将lib设置添加到Android.mak,因为CallStack.tpp在libutils中
LOCAL_SHARED_LIBRARIES + = libutils
但是我总是收到错误消息:
错误:未定义对“ android :: CallStack :: CallStack()”的引用
错误:未定义对“ android :: CallStack :: update(int,int)”的引用
...
似乎可执行文件在链接时解析符号,而不是在运行时加载.so文件?我会丢失某些东西还是Android构建系统存在某些限制吗?
我知道这是一个简单的问题,但我确实需要帮助...
更新1
我尝试将代码添加到另一个可执行文件中。结果是一样的...有人知道android构建系统的规则吗?
更新2
我的控制台中有一些关键字“ target StaticExecutable:...”,我认为这就是答案。
我的perl脚本在一个机制上工作但在另一个机制上失败.
我使用perl调试器通过在命令中添加"-d"来调试它.即"perl -d my_perl.pl".然后我发现所有"整数比较"仅适用于TRUE结果.
例如,如果我输入debug命令
"x(1 == 1)"
它返回'1'(TRUE).但是如果我输入debug命令
"x(1!= 1)"
它返回''(没有,结果预计为0(FALSE)).
顺便说一下,字符串比较是一样的.x"s"eq"s"返回'1'和x"s"eq"s"返回''.
我使用perl v5.14.2(通过perl -v获取).我的perl有什么问题?我该如何解决?