2012年7月第3周

Tombstone相关

一般tombstone都发生在native层,如果native层的代码地址访问越界,即所谓的段错误,系统会发一个SIGSEGV的信号给出现异常的进程,在相应的信号处理程序(bionic/linker/debugger.c)中,会通过socket向debuggerd守护进程(system/core/debuggerd/debugger.c)发送一个消息,然后debbuggerd进程会保存和解析出现异常进程的

堆栈信息和调用链,这里只解析了native层的调用链,而没有Java虚拟机的调用链,而tombsotne的发生有可能是Java层的代码向下层传递了错误的参数所导致的,因此上层的调用过程可能也是十分有用的。如果在解析之前向出现异常进程发送一个信号,这样异常的进程就有机会调用相应的接口来保存Java虚拟机的调用链,因此在Java虚拟机里面实现信号的处理程序(dalvik/vm/SignalCatcher.cpp)来保存相应的调用过程。


工具相关:

repo / git

 如果在某个工程中(即包含一个.git/的目录中), 用git branch test来创建一个分支时,在用git pull 来更新代码时,会提示如下的出错信息

fatal: No remote repository specified.  Please, specify either a URL or a
remote name from which new revisions should be fetched.

可能的原因是如果用git branch来创建分支的时候,绕过了repo的管理,所以在同步的时候会出现错误,正确的创建分支的做法是在源码的根目录下使用

repo start  + 分支名 + 工程名

然后在使用git pull来同步就木有问题了


Gerrit

向Gerrit提交一个patch时,如果针对同一个BUG的两个不同版本patch的Change-Id不一样时,在Gerrit上面会有两个patch, 而不是在前一个patch的基础上递增patch的version号,解决的办法是在修改前一个patch的时候,尽量不用要git reset HEAD^的方法来revert,可以使用git commit -a --amend增补的方法来生成新的patch,这样不会改变Change-Id, 如果已经使用了git reset HEAD^方法,可以在相应的patch里修改Change-Id 来达到version递增的效果。



获取一个文件的状态信息的系统调用stat()

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>


int stat(const char *path,  struct stat *buf);

int  fstat(int fd ,  struct stat  *buf);


数据结构struct  stat的定义

struct  stat {

dev_t   st_dev;

ino_t   st_ino;

mode_t   st_mode;

off_t     st_size;   /* total size, in bytes */

...

time-related 

}

利用该 系统调用可以获取文件大小,所在设备号,访问权限和时间戳等相关信息,信息保存在输出参数buf中,

在利用系统定义的一些位掩码可以判断相应的文件类型和权限等信息

eg:

           S_IWGRP    00020     group has write permission
           S_IXGRP    00010     group has execute permission
           S_IRWXO    00007     mask for permissions for others (not in group)
           S_IROTH    00004     others have read permission
           S_IWOTH    00002     others have write permission
           S_IXOTH    00001     others have execute permission


__builtin_return_address(level)    gcc feature

                                       
#include <linux/init.h>
#include <linux/module.h>


int a;
void f4()
{
pr_info("%s: level 0 ## %pf\n",__func__, __builtin_return_address(0));
pr_info("%s: level 1 ## %pf\n",__func__, __builtin_return_address(1));
pr_info("%s: level 2 ## %pf\n",__func__, __builtin_return_address(2));
pr_info("%s: level 3 ## %pf\n",__func__, __builtin_return_address(3));
pr_info("%s: level 4 ## %pf\n",__func__, __builtin_return_address(4));
}
void f3()
{
f4();
a = 5;
return ;
}
void f2()
{
f3();
a = 5;
return ;
}
void f1()
{
f2();
a = 5;
return ;

}
void f0()
{
f1();
a = 5;
return ;
}
MODULE_LICENSE("Dual BSD/GPL");


static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
f0();
a = 5;
return 0;
}


static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}


module_init(hello_init);
module_exit(hello_exit);


Result:

  886.770466] Hello, world
[  886.770515] f4: level 0 ## f3
[  886.770521] f4: level 1 ## f2
[  886.770525] f4: level 2 ## f1
[  886.770528] f4: level 3 ## f0
[  886.770532] f4: level 4 ## hello_init







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值