Android短信欺诈(Smishing)漏洞

本文章由Jack_Jia编写,转载请注明出处。
文章链接:
http://blog.csdn.net/jiazhijun/article/details/8631829
作者:Jack_Jia    邮箱: 309zhijun@163.com

一、漏洞描述
    北卡罗来纳州州立大学研究员日前在进行一项有关智能手机的研究项目中发现了一个存在于Android 平台的“短信欺诈”(Smishing)漏洞,据悉,该漏洞可以允许应用在Android平台上进行短信伪装,且在所有版本的Android软件中都存在这一漏洞。
  攻击者可利用漏洞窃取个人资料,攻击者也可以利用漏洞,将自己的手机号码伪装成银行或亲友等号码。
二、影响版本
    Froyo (2.2.x), Gingerbread (2.3.x), Ice Cream Sandwich (4.0.x), and Jelly Bean (4.1)
三、漏洞原理
    Android系统有一套比较完善的安全体系,权限管理就是其中的一部分。当应用需要操作敏感数据时,需要申请相应的权限。
    该系统漏洞能够使攻击者无需申请任何权限发送短信到用户收件箱。
    出现该漏洞的原因是Android系统的com.android.mms.transaction.SmsReceiverService系统服务未判断启动服务的调用者,攻击者可以通过该应用发送伪装短信到用户收件箱。本漏洞实质上是一种能力的泄漏。
四、POC代码
    Intent intent = new Intent();
    byte[] pdus = new byte[]{…}; // the sms pdus bytes
    intent.setClassName(“com.android.mms”, “com.android.mms.transaction.SmsReceiverService”);
    intent.setAction(“android.provider.Telephony.SMS_RECEIVED”);
    intent.putExtra(“pdus”, new byte[][]{pdus});
    this.startService(intent);
五、相关链接
    http://www.csc.ncsu.edu/faculty/jiang/smishing.html
    http://www.newhua.com/2012/1109/183383.shtml

关于Android系统的Smishing攻击

1. 来自手机内其他app的威胁:

有些apk利用android系统的Smishing漏洞来伪造短信广播, 并使用伪造的短信欺骗用户,发送高消费短信,拨打高消费电话或者泄露银行账号等个人信息

2. 来自他人发来的包含欺诈内容或者欺诈链接的短信:

伪造成人网站链接,或者中奖信息链接,将用户引导到有害站点或者骗取用户身份证,手机号,银行账号等个人隐私

 

防范方法:

1. —

2. —

 

Smishing的例子:

 

Examples of fraudulent SMiShing messages:

 

  • Credit Union N.A. Please call us immediately at 1-888-xxx-xxxx regarding a recent restriction placed on your account. Thank you.
  • Alert!! Honolulu City & County Employees has limited your account pending verifications. Contact us NOW at 213-xxx-xxxx

 

参考文献:

 

[1]. http://www.csc.ncsu.edu/faculty/jiang/smishing.html

[2]. http://www.t-mobile.com/Company/PrivacyResources.aspx?tp=Abt_Tab_PhishingSMishing&tsp=Abt_Sub_IdentityTheft_SMiShing

[3]. NBC News: NBC News Reports on SMiShing Text Claiming to Be From Wal-Mart, November, 2012

[4].  PCWorld: ‘Smishing’ Attacks Are on the Rise, May 2012

基于TF/IDF的聚类算法原理

 

一.TF/IDF描述单个term与特定document的相关性
TF(Term Frequency): 表示一个term与某个document的相关性。
公式为这个term在document中出现的次数除以该document中所有term出现的总次数.

IDF(Inverse Document Frequency)表示一个term表示document的主题的权重大小。主要是通过包含了该term的docuement的数量和docuement set的总数量来比较的。出现的次数越多,权重越小。

   公式是log(D/Dt)   D是docuemnt set的总数量, Dt是包含了该term的document的总数。

这样,根据关键字k1,k2,k3进行搜索结果的相关性就变成TF1*IDF1 + TF2*IDF2 + TF3*IDF3。

比如document1的term总量为1000,k1,k2,k3在document1出现的次数是100,200,50。包含了k1, k2, k3的docuement总量分别是1000, 10000,5000。document set的总量为10000。
TF1 = 100/1000 = 0.1
TF2 = 200/1000 = 0.2
TF3 = 50/1000 = 0.05
IDF1 = log(10000/1000) = log(10) = 2.3
IDF2 = log(10000/100000) = log(1) = 0;
IDF3 = log(10000/5000) = log(2) = 0.69
这样关键字k1,k2,k3与docuement1的相关性= 0.1*2.3 + 0.2*0 + 0.05*0.69 = 0.2645
其中k1比k3的比重在document1要大,k2的比重是0.

TF/IDF 的概念就是一个特定条件下、关键词的概率分布的交叉熵(Kullback-Leibler Divergence).

二.用TF/IDF来描述document的相似性。
假如document1和document2的term的TF/IDF分别是t11,t12,t13,…t1n和t21,t22,t23,…,t2n.他们之间的相似性可以用余弦定理来表示。则:
cos(d1,d2) = d1和d2的内积/(d1的长度*d2的长度) = (t11*t21 + t12*t22 + t13*t23 + … + t1n*t2n)/(|d1|*|d2|).
d1 = sqrt(t11*t11 + t12*t12 + t13*t13 + … + t1n*t1n);
夹角越大,相似性越大。为1则表示d1和d2一致。

详细解释情况吴军的 《数学之美 系列九 — 如何确定网页和查询的相关性》 和 《数学之美系列 12 – 余弦定理和新闻的分类》

教你如何找到导致程序跑飞的指令

转载自: http://blog.sina.com.cn/s/blog_908da74601011g31.html

本节PDF文档请在http://dl.dbank.com/c05ix5bmht下载

调试嵌入式程序时,你是否遇到过程序跑飞最终导致硬件异常中断的问题?遇到这种问题是否感觉比较难定位?不知道问题出在哪里,没有办法跟踪?尤其是当别人的程序踩了自己的内存,那就只能哭了🙁

今天在论坛上看有同学求助这种问题,正好我还算有一点办法,就和大家分享一下。

解决办法非常非常简单,本文将以Aduc7026ARM7内核)和LM3S8962cortex内核,STM32也是cortex内核,同理)为例,讲讲解如何定位此种问题。

先说ARM7内核,cortex内核稍微有一点复杂,后面再说。

ARM7内核有多种工作模式,每种模式下有R0~R15以及CPSR17个寄存器可以使用,有关这些寄存器的细节我就不详细介绍了,详细的介绍请参考“底层工作者手册之嵌入式操作系统内核”中的2.2~2.3节,这里只介绍与本文相关的寄存器。

其中R14又叫做LR寄存器,它被用来保存函数、中断调用时的返回地址,看到了吧,它保存了“返回地址”!这不就是我们需要的么?就这么简单,发生异常中断时,LR寄存器中保存的地址附近就会有导致异常的指令。

接下来我们再先了解一下相关的知识,然后再通过一个例子构造一个指令异常,然后再反推找到产生异常的这条指令,做一个实例演练!

当程序跑飞时,绝大部分情况都会触发硬件异常中断,硬件异常中断的中断服务函数在中断向量表中有定义,我们来看看ARM7的中断向量表,在keil开发环境里(以下例子是在keil环境下介绍的),这个文件一般叫startup.s,如下:

Vectors:        LDR     PC, Reset_Addr

               LDR     PC, Undef_Addr

               LDR     PC, SWI_Addr

               LDR     PC, PAbt_Addr

               LDR     PC, DAbt_Addr

               NOP                            

               LDR     PC, IRQ_Addr

               LDR     PC, FIQ_Addr

Reset_Addr:     .word   Reset_Handler

Undef_Addr:     .word   ADI_UNDEF_Interrupt_Setup

SWI_Addr:       .word   ADI_SWI_Interrupt_Setup

PAbt_Addr:      .word   ADI_PABORT_Interrupt_Setup

DAbt_Addr:      .word   ADI_DABORT_Interrupt_Setup

IRQ_Addr:       .word   ADI_IRQ_Interrupt_Setup

FIQ_Addr:       .word   ADI_FIQ_Interrupt_Setup

ARM7的中断向量表比较简单,只有7种中断,它把所有正常的中断都放到了SWIIRQFIQ中了,那么本文所介绍的异常情况将会触发UndefPAbt或者DAbt异常中断,至于是哪种就需要看具体的原因了。

指令   //触发异常

指令B

比如说当指令A无法执行时,它就会触发异常中断,硬件就会自动将这条指令后面的指令的所在地址,也就是指令B的地址保存到LR寄存器中,然后就跳转到与这种异常相关的中断向量表中,假如指令A触发了Undef异常中断,那么硬件就会跳转到中断向量表的第二个中断向量Undef_Addr,从中断向量表可知,这个中断向量对应的中断服务函数就是ADI_UNDEF_Interrupt_Setup,这个函数一般是一个死循环,这样单板就死了,当我们停下程序时,就会发现程序停在了这个函数里面。

我们来看下面这个实例,我把定位过程的每一步都记录下来,一起来看下:

14  S32 main(void)

15  {

16      U8* pucAddr;

17  

18      

19      DEV_HardwareInit();

20  

21      

22      WLX_TaskInit(1, TEST_TestTask1, TEST_GetTaskInitSp(1));

23      WLX_TaskInit(2, TEST_TestTask2, TEST_GetTaskInitSp(2));

24  

25      

26      pucAddr (U8*)0;

27      *pucAddr 0;

28      

29  

30  

31      

32      WLX_TaskStart();

33  

34      return 0;

35  }

上面这段测试代码是我在我写的一个小型嵌入式操作系统上改的(有兴趣的话可以访问我的博客O(_)O),只需要关注2627行即可,其余的只是陪衬,以使这段程序看起来稍微复杂一些。这两行指令将0地址清00地址是中断向量表,向这个地址写数据会导致异常的,但——这正是我们所需要的。

然后,为了方便,我们在中断向量表里把上面的3个异常中断向量都修改一下,如下:

Vectors:        LDR     PC, Reset_Addr

               LDR     PC, FaultIsr

               LDR     PC, SWI_Addr

               LDR     PC, FaultIsr

               LDR     PC, FaultIsr

               NOP                            

               LDR     PC, IRQ_Addr

               LDR     PC, FIQ_Addr

这样,只要发生异常中断就都会进入FaultIsr函数,FaultIsr函数如下:

void FaultIsr()

{

   while(1)

  {

       ;

  }

}

可以看到FaultIsr函数是个死循环,所以当程序发生异常跑飞时就会死在这里了。

准备工作完成,准备实战演练!在这之前还有一点需要注意,那就是最好将编译选项设置为不优化,这样方便我们定位问题。当然,实际情况也许不允许我们这么做,这样的话就需要你有比较高的汇编语言水平了,这不在本文讨论之内,先不管了。我们在这个例子里将编译选项设置为不优化。

我们将上面改动后的代码重新编译,然后加载到单板里,进入仿真状态,然后全速运行,然后再停止运行,我们就可以发现程序死在FaultIsr函数里了,如下图所示:

教你如何找到导致程序跑飞的指令

图1

从图1可以看到程序停在了42行,这与我们的设计是一致的。在图1的左侧显示了此时各个寄存器内的数值,注意到LR寄存器了吧,这里保存的就是返回地址,出错的指令就在这附近。但,还有一点需要注意,FaultIsr函数是C语言函数,它运行时可能会修改LR寄存器,如果是这样的话,那么此时LR寄存器内的数值就不是发生异常时的值了,为解决此问题,我们可以找到FaultIsr函数的起始地址,将断点打在FaultIsr函数的起始地址,这样当异常发生时就会停在断点的地方,也就是FaultIsr函数的起始地址,这样就可以保证LR寄存器的值就是发生异常时的值了。

如果你的汇编语言足够好,那么你可以在图1右上角的汇编窗口里向上找,找到FaultIsr函数的起始地址。另外,我们还可以通过一个简单的方法找到FaultIsr函数的起始地址。我们在keil的选项中选择生成map文件,代码编译后就会生成一个map文件,我们可以从这个文件里找到FaultIsr函数的地址。

使用一个文本编辑器打开这个map文件,然后搜索“FaultIsr”,如下图,我们就找到了FaultIsr函数的起始地址:0x80608

教你如何找到导致程序跑飞的指令

2

在汇编窗口找到0x80608的地址,打上断点,如下图所示:

教你如何找到导致程序跑飞的指令

3

复位程序,再重新全速跑一遍,我们就会发现程序停在了断点上,这时LR里面的数值就是程序异常时存入的返回地址,通过这个地址差不多就可以找到出错的指令了。

如图3所示,LR的值为0x805ec,我们在汇编窗口里跳到这个地址,如下图所示:

教你如何找到导致程序跑飞的指令

4

ARM7内核有2级流水线,存入LR的地址一般会多+8个字节,因此0x805ec-8=0x805e4,如图4所示,0x805e4地址是一条STRB R2[R3]指令,这条指令的意思是将R2寄存器里的数值保存到R3寄存器所指向的地址(一个字节)内。从图3左侧可以看到R2寄存器的数值为0R3寄存器的数值也为0,那么这条指令的意思就是将0这个数值写入0地址这个字节内,这不是正好对应上述main函数中27行的C指令么?

看到这里我们就应该明白了,向0地址写0,这条C指令有问题,那么这个跑飞的问题也就找到原因了,是不是很简单?

当然,实际情况可能要比上述介绍的情况复杂的多。实际使用的程序几乎都是经过优化的,这样从汇编指令找到C指令就会比较麻烦。还有可能FaultIsr函数的指令或者堆栈被破坏了,那么FaultIsr函数运行都会出问题。还有可能出错的指令不会象27行这么明显,可能是经过了前面很多步骤的积累才在这里触发异常的,最典型的就是别人的程序踩了你的内存,结果错误在你的程序里表现出来了,如果遇到这种情况你就先哭一顿吧。对于这种踩内存的情况也是可以通过这种方法定位的,但这相当复杂,需要从出错点开始到触发异常点为止,这之间所有的堆栈信息,然后从最后的堆栈开始,结合反汇编的代码,从最后一条指令向前推,直到发现问题的根源。这种方法相当于是我们用我们的大脑模拟CPU的反向运行过程,如果程序是经过优化的,那么这个过程就更麻烦了。我准备在“底层工作者手册之嵌入式操作系统内核”6.1节实例讲解一个这种情况(现在是2012.02.28,手册暂时只写到了5.4节)。

好了,先不说这么复杂的了,接着上面的继续说。

有时候出现问题的单板并不在我们手边,问题也许不能复现,那么我们就可以预先在FaultIsr函数里做一个打印功能——将出现异常时的寄存器、堆栈、软件版本号等信息打印出来,编写这样的FaultIsr函数需要注意,FaultIsr函数开始的代码一定要用汇编语言来写,以防止调用FaultIsr函数时的寄存器、堆栈信息被C语言破坏。

如果我们的单板有这样的功能,那么当单板跑死时,一般情况都会向外打印信息,比如上面的例子,就会打印出LR的值为0x805ec。但我们似乎又遇到了一个问题,我们如何知道0x805ec这个地址是哪个函数的?别忘了,我们在一个版本发布时会将软件所有的信息归档(什么?没归档!这样的公司我劝你还是走了吧),根据软件版本号找到出问题的软件的归档文件,取出map文件,利用上面讲述的方法通过map文件我们就可以找到出问题的函数了。再通过软件版本从归档文件中找到这个函数最终编译链接生成的目标文件,一般为.o.axf.elf等文件(必须是静态链接的文件,需要有各种段信息的),不能是binhex等文件,windowslinux等动态链接的文件已经超出了我目前的知识范围,也不再其中。

然后使用objdump程序进行反汇编,将目标文件与objdump程序放到同一个目录,在cmd窗口下进到这个目录,执行下面命令:

objdump -d wanlix.elf >> uncode.txt

这行命令的意思是将wanlix.elf目标程序进行反汇编,反汇编的结果以文本格式存入uncode.txt文本文件。

我们用文本编辑器打开uncode.txt文件,找到0x805ec地址,如下图所示:

教你如何找到导致程序跑飞的指令

5

如图5所示,我们可以看到0x805ec这个地址位于main函数内,我们再对比一下图5和图4中的指令,可以发现它们是相同的,可能写法上会有一些差异,但功能是相同的。

好了,ARM7内核的介绍到此结束,下面介绍cortex内核的,使用STSTM32TILM3S系列的同学们注意了,它们都是cortex内核的,下面的介绍你也许用得上。

Cortex内核与ARM7内核定位此种问题的思路完全是一样的,cortex内核的详细介绍请参考“底层工作者手册之嵌入式操作系统内核”中的5.1节。cortex内核有一些特殊,它在产生中断时会先将R0~R3R12LRPC以及XPSR8个寄存器压入当前的堆栈,然后才跳转到中断向量表执行中断服务程序,此时LR中保存的不是返回地址,而是返回时所使用的芯片模式和堆栈寄存器的标示,只能是0xFFFFFFF10xFFFFFFF9或者是0xFFFFFFFD3个值中的一个,如果你还认为LR中保存的是返回地址,并且是这么奇特的地址,估计你一定会晕了。

要找cortex内核芯片的返回地址就需要到栈中去找,前面不是说了么,进入中断前硬件会自动向当前栈压入8个寄存器,如下图所示:

教你如何找到导致程序跑飞的指令

图6

如果你看了2.3节和5.1节就应该知道cortexARM7内核都是一种递减满栈,意思是说压栈时栈指针向低地址移动,栈指针指向最后压入的数据。SPR13)寄存器就是栈寄存器,它里面保存的就是当前的栈指针,因此当cortex内核发生中断时,我们就可以根据SP指针来找到压入上述8个寄存器的地址,然后找到LR的位置,再从LR中找到返回地址,下面的这个例子是“底层工作者手册之嵌入式操作系统内核”中的6.1节的一个例子,

void TEST_TestTask1(void)

{

   while(1)

   {

       DEV_PutStrToMem((U8*)”\r\nTask1 is running! Tick is: %d”,

                       MDS_SystemTickGet());

       DEV_DelayMs(1000);

       MDS_TaskDelay(250);

       if(MDS_SystemTickGet() >= 2000)

       {

           ADDRVAL(0xFFFFFFFF) 0;

       }

   }

}

   红色字体部分会触发一个异常,它会向0xFFFFFFFF这个地址写入0,也会触发一个异常中断,触发的异常会进入MDS_FaultIsrContext异常中断服务函数,在MDS_FaultIsrContext函数的入口地址打上断点,运行此程序,触发异常后如下图:

教你如何找到导致程序跑飞的指令

图7

   从图7左上侧窗口可以看到SP的值为0x20001258,那么我们在右下角的窗口找到0x20001258这块内存的地址,从0x20001258开始,每4个字节对应一个寄存器,依次为R0R1R2R3R12LRPCXPSR,其中红框的位置就对应着LR,从图中可以看到LR的值为0x1669,我们找到这个版本编译后的目标文件,使用objdump软件反汇编,如下图所示:

教你如何找到导致程序跑飞的指令

图8

可以看到0x1669这个地址位于TEST_TestTask1函数里,与我们设计的一致。

这段代码是经过O2优化的,汇编指令对照到C指令上会有些费事,这里就不再讲解了,知道方法就好,剩下的自己研究。

这里面有2点说明一下,一是cortex内核支持双堆栈,如果使用双堆栈的话会复杂一点,这里为了简单的说明问题,我们只使用了其中的一个MSP,另外一个PSP没有使用,在这个例子里你只需要认为只有一个SP就可以了。另外一点是0x1669这个地址其实就是0x1668,因为cortex内核采用的是Thumb2指令集,该指令集要求指令的最后一个bit1,因此0x1668就变成了0x1669

上面介绍ARM7内核的时候我不是说过如果在FaultIsr函数里做一个打印功能就可以通过打印信息来定位这种问题么,其实在介绍cortex内核的这个例子中我就做了这个功能,具体的实现就先不介绍了,有兴趣的同学可以看我6.1节的介绍(2012.02.28,目前book还没写到6.1节),下面是出现异常时打印的一小段信息,从这段信息里我们可以看到SPR13)的数值为0x20001258,与图7的情况一样,那么在栈中从0x20001258这个地址向上找,找到栈中保存LR的位置,它的数值就是0x1669,与图7中的分析是一致的。

注意一点蓝色字体的R14是我这段打印程序还原过的,因此它与内存中的数值是一样的。

R15 0x00000536 R14 0x00001669 R13 0x20001258 R12 0x00000000

R11 0x00000000 R10 0x00000000 R9  0x00000000 R8  0x00000000

R7  0x00000000 R6  0x000003E8 R5  0x000007D0 R4  0x00000000

R3  0x0000008C R2  0x00000000 R1  0xE000ED04 R0  0x00000834

XPSR= 0x21000000

0x20001274: 0x21000000

0x20001270: 0x00000536

0x2000126C: 0x00001669

0x20001268: 0x00000000

0x20001264: 0x0000008C

0x20001260: 0x00000000

0x2000125C: 0xE000ED04

0x20001258: 0x00000834

sublime text 2 for linux [ubuntu] 安装与破解方法全解

ubuntu安装sublime text 2:

输入一下语句即可:

sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update
sudo apt-get install sublime-text
# or dev version
# sudo apt-get install sublime-text-dev

 

然后就是破解了!

which sublime-text 找到sublime的位置为: /usr/bin/sublime-text

sudo vim /usr/bin/sublime-text  查看sublime安装的真正位置,

我的是:/opt/sublime-text/里面

然后安装以下过程对其破解:【转】亲试成功

Linux 下的Sublime Text 2 版本:2.0.1 Build 2217。

这个版本中破解需要额外的技巧,之前的方法可用的已经不多

1.去其官方网站http://www.sublimetext.com/ 把linux版下载下来,解开压缩包,放在你希望的路径下。

2.用vim将其打开

vim sublime_text

3.将文件转成十六进制形式。vim中输入

:%!xxd

3.在vim中定位至“Thanks”文字附近。

/Thanks

4.接着查找数字串“3342”。

/3342

找到一处3342的地方大致是这个样子 ……4333 3342 3032…….

将这里的3342 改为3242。

5.将文件转换回去。

:%!xxd -r

6.保存文件、退出。

:wq

7.打开程序,去help-enter licence 里贴进去通过程序算出来的Licence,OK 成功了。

如有对程序有希望含有自己签名的需求可以单独联系。

这里贴出来几个算好的供使用。

—–BEGIN LICENSE—–
China
Unlimited User License
EA7E-2861
BE67D2175D3569FDAB9EB5340FAD2822
E7B56B3397A76AA9FBE8AC3D3C65918B
DFC28F2EA158140D9E07853D594818EB
3A237B2E8E98ED257C269548F50EDA34
EF0C7F72D8917DB538A0245E46BFD6B1
85F4EDE331F253530ED67A5C19E92399
04C5F4A1AF4AF3DB5EC49C1FEE17CA76
7E369F8AAE4AC6C6E756B5882E1608B9
—–END LICENSE—–

—–BEGIN LICENSE—–
USA
Unlimited User License
EA7E-1640
763D05839CA08BDA7B0103B5BABF0150
195EE53CC33B569858AFD553F080A9BC
1F678C88A1342AC92CA596FE775E7014
5A0EE55DC2F8DE3C4ED6B5B02FD4DB3C
493FCE3EE61FC0588CDAFAAD731BB47F
FD047777D02A5BE92202B3D3EB59A696
A69DFEF6687D16FCD4443556912A1F62
82DA125263C5BC270CEE7664B5D0CEB9
—–END LICENSE—–

—–BEGIN LICENSE—–
A
Unlimited User License
EA7E-20708
A7281D6781626F2A37D6355121079ACA
DF60119B9D27D4CBDA75FA63D633A671
9521D96D375D8DD95DF3F89231E38F8D
459374CC62D1C1B410C0BDFD2503670E
603BB1DCA7D20E85B0AF19BAE0A59822
F7B1F83659D4D7787C4F040FE9402FCD
B9608A9012BDA8B65524B4DEDE4C00D0
76461448E2AAEC027060C26B038D502B
—–END LICENSE—–

—–BEGIN LICENSE—–
B
Unlimited User License
EA7E-13207
B5C54DD7413302E87A9ED4155E90D5E0
684F7A34714D278ABE2731F0270034E2
9722AEC71E04043C0E9D4496D1DA161B
D76CE81501A247F3E03F57D6EC1E76AE
12BE9CD453D1E651AF4BD187CC10FEB0
EB24FBAB7511F2F37E5F745D13D0641F
7D1BEEE98A9646A02B616BF98EB43F84
B04029D72C610086A666DB318A526A2F
—–END LICENSE—–

—–BEGIN LICENSE—–
Love
Unlimited User License
EA7E-8441
918381ACA844A0379CCAC729059720A4
BC9D409098618744BB45FF23E67568DB
82B926D92157127DB3B4054834D0477F
DD9C2B251A57F2E3259E04AD9B7DB8B8
1778C37C1D3B494671C5F4ECFBD2B519
361CD9624A56C21F54F8DD51F5BDF799
68F9537ED74680494853423904F032BA
3E896607B4D398E8C897A4DD1A8CB449
—–END LICENSE—–

—–BEGIN LICENSE—–
NightM
Unlimited User License
EA7E-5177
8125006DCD9E513CD4F1C217CAD3801D
E72D3130CA1F04CFEDF3696C0F68553D
DC42B172E38962890A87035FCE26049F
15EFA09D4BCC811617915165959A499F
402866AFC08E72615336D863968B60FB
C9167F72F4B25ED5E8E593D2E19F43E7
C7EC9F459EA62F1DD1757DC9967C4801
8E48683A4F0F9CAC3CC0621F2D48292F
—–END LICENSE—–

原创文章,转载请注明: 转载自Definite

本文链接地址: Linux 下 Sublime Text 2 破解

 

 

gdb running in android operating system

Goal

Run a program under gdb

Download/install gdb

Run the commands at an adb command line. This will require a working busybox (tar, wget) in your path. Running under a terminal will require adjusting your paths.

  • cd /data/local/tmp
  • wget http://dan.drown.org/android/gdb-static.tar.gz
  • tar zxf gdb-static.tar.gz

Run a program under gdb

Here, I created a small program that crashes and put it in /data/local/tmp

  • /data/local/tmp/bin/gdb [path to program]

Below is a sample session, typed commands are in bold

Reading symbols from /data/local/tmp/crash...done.
(gdb) run
Starting program: /data/local/tmp/crash
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.

Program received signal SIGSEGV, Segmentation fault.
0x0000859c in main ()
(gdb) info regi
r0             0x1      1
r1             0xbecc6b34       -1093899468
r2             0x0      0
r3             0x0      0
r4             0x8580   34176
r5             0xbecc6b34       -1093899468
r6             0x1      1
r7             0xbecc6b3c       -1093899460
r8             0x0      0
r9             0x0      0
r10            0x0      0
r11            0xbecc6b14       -1093899500
r12            0x400d200c       1074601996
sp             0xbecc6b08       0xbecc6b08
lr             0x4012d169       1074975081
pc             0x859c   0x859c <main+28>
cpsr           0x60070010       1611071504
(gdb) x/i $pc
=> 0x859c <main+28>:    str     r2, [r3]

You can see that this program is trying to store the value in r2 (0x0) in the address pointed to by r3 (0x0), which resulted in the segmentation fault.

here: gdb-static.tar 下载

linux上terminal快捷键

linux下terminal快捷键

本文讲述了Linux命令行编辑快捷键的方法,希望对您有所帮助。
Linux命令行编辑快捷键:
history 显示命令历史列表
↑(Ctrl+p) 显示上一条命令
↓(Ctrl+n) 显示下一条命令
!num 执行命令历史列表的第num条命令
!! 执行上一条命令
!?string? 执行含有string字符串的最新命令
Ctrl+r 然后输入若干字符,开始向上搜索包含该字符的命令,继续按Ctrl+r,搜索上一条匹配的命令
Ctrl+s 与Ctrl+r类似,只是正向检索
Alt+< 历史列表第一项
Alt+> 历史列表最后一项
Ctrl+f 光标向前移动一个字符,相当与->
Ctrl+b 光标向后移动一个字符,相当与<-
Alt+f 光标向前移动一个单词
Alt+b 光标向后移动一个单词
ls !$ 执行命令ls,并以上一条命令的参数为其参数
Ctrl+a 移动到当前行的开头
Ctrl+e 移动到当前行的结尾
Esc+b 移动到当前单词的开头
Esc+f 移动到当前单词的结尾
Ctrl+l 清屏
Ctrl+u 剪切命令行中光标所在处之前的所有字符(不包括自身)
Ctrl+k 剪切命令行中光标所在处之后的所有字符(包括自身)
Ctrl+d 删除光标所在处字符
Ctrl+h 删除光标所在处前一个字符
Ctrl+y 粘贴刚才所删除的字符
Ctrl+w 剪切光标所在处之前的一个词(以空格、标点等为分隔符)
Alt+d 剪切光标之后的词
Esc+w 删除光标所在处之前的字符至其单词尾(以空格、标点等为分隔符)
Ctrl+t 颠倒光标所在处及其之前的字符位置,并将光标移动到下一个字符
Alt+t 交换当前与以前单词的位置
Alt+u 把当前词转化为大写
Alt+l 把当前词转化为小写
Alt+c 把当前词汇变成首字符大写
Ctrl+v 插入特殊字符,如Ctrl+v+Tab加入Tab字符键
Esc+t 颠倒光标所在处及其相邻单词的位置
Ctrl+c 删除整行
Ctrl+(x u) 按住Ctrl的同时再先后按x和u,撤销刚才的操作
Ctrl+s 挂起当前shell
Ctrl+q 重新启用挂起的shell
[Ctrl] + [Alt] + [Backspace] = 杀死你当前的 X 会话。杀死图形化桌面会话,把你返回到登录屏幕。如果正常退出步骤不起作用,你可以使用这种方法。
[Ctrl] + [Alt] + [Delete] = 关机和重新引导 Red Hat Linux。关闭你当前的会话然后重新引导 OS。只有在正常关机步骤不起作用时才使用这种方法。
[Ctrl] + [Alt] + [Fn] = 切换屏幕。 [Ctrl] + [Alt] + 功能键之一会显示一个新屏幕。根据默认设置,从 [F1] 到 [F6] 是 shell 提示屏幕, [F7] 是图形化屏幕。
[Alt] + [Tab] = 在图形化桌面环境中切换任务。如果你同时打开了不止一个应用程序,你可以使用 [Alt] + [Tab] 来在打开的任务和应用程序间切换。
[Ctrl] + [a] = 把光标移到行首。它在多数文本编辑器和 Mozilla 的 URL 字段内可以使用。
[Ctrl] + [d] = 从 shell 提示中注销(并关闭)。使用该快捷键,你就不必键入 exit 或 logout 。
[Ctrl] + [e] = 把光标移到行尾。它在多数文本编辑器和 Mozilla 的 URL 字段内都可使用。
[Ctrl] + [l] = 清除终端。该快捷操作与在命令行键入 clear 作用相同。
[Ctrl] + = 清除当前行。如果你在终端下工作,使用这一快捷操作可以清除从光标处到行首的字符。
[鼠标中间键] = 粘贴突出显示的文本。使用鼠标左键来突出显示文本。把光标指向你想粘贴文本的地方。点击鼠标中间键来粘贴它。在两键鼠标系统中,如果你把鼠标配置成模拟第三键,你可以同时点击鼠标的左右两键来执行粘贴。
[Tab] =命令行自动补全。使用 shell 提示时可使用这一命令。键入命令或文件名的前几个字符,然后按 [Tab] 键,它会自动补全命令或显示匹配你键入字符的所有命令。
[向上] 和 [向下] 箭头 = 显示命令历史。当你使用 shell 提示时,按 [向上] 或 [向下] 箭头来前后查看你在当前目录下键入的命令历史。当你看到你想使用的命令时,按 [Enter] 键。
clear = 清除 shell 提示屏幕。在命令行下键入它会清除所有这个 shell 提示屏幕中显示的数据。
exit = 注销。在 shell 提示中键入它会注销当前的用户或根用户帐号。
history = 显示命令历史。在 shell 提示中键入它来显示你所键入的被编号的前 1000 个命令。要显示较短的命令历史,键入 history f之后,空一格,在键入一个数字。例如: history 20 。
reset = 刷新 shell 提示屏幕。如果字符不清晰或乱码的话,在 shell 提示下键入这个命令会刷新屏幕。
# Ctrl-U: 擦除一行光标前面的部分。
# Ctrl-H: 擦除光标前面的一个字符。
# Ctrl-D: 终止输入。(退出 shell,如果您正在使用 shell 的话)。
# Ctrl-C: 终止当前正在运行的程序。
# Ctrl-Z: 暂停程序。
&”)
# Ctrl-S: 停止向屏幕输出。
# Ctrl-Q: 重新激活向屏幕输出。
默认的 shell,`bash’, 有历史编辑和 tab 补齐功能。
# up-arrow: 开始历史命令搜索。
# Ctrl-R: 开始增量历史命令搜索,可以按照关键字查查自己用过哪些命令。
# TAB: 完整的把文件名输入到命令行。
# Ctrl-V TAB: 输入 TAB 而不是扩展命令行。
# Ctrl + P – 上一条命令
# Ctrl + N – 下一条命令
# Ctrl-U: 擦除一行光标前面的部分。
# Ctrl + Y – 粘贴前一Ctrl+U类命令删除的字符 ,是粘贴不是撤销啊!
下面的应用可能稍稍高级一点点
# !! – 上一条命令
# !-n – 倒数第N条历史命令
# !-n:p – 打印上一条命令(不执行)
# !?string?- 最新一条含有“string”的命令
# !-n:gs/str1/str2/ – 将倒数第N条命令的str1替换为str2,并执行(若不加g,则仅替换第一个)
其他一些有用的Linux命令行按键组合。
Ctrl-Alt-Del:挂起或者重新启动系统,这三个Linux命令行按键在Linux下可以轻松地修改成关机的操作,这对于单用户的朋友还是很方便的
# Ctrl + l – 清屏
# Ctrl + A – 光标移到行首
# Ctrl + E – 光标移到行尾
# Ctrl + W – 清除光标之前一个单词
# Ctrl + K – 清除光标到行尾的字符
# Ctrl + T – 交换光标前两个字符
# Ctrl + V – 输入控制字符 如Ctrl+v ,会输入^M
# Ctrl + F – 光标后移一个字符
# Ctrl + B – 光标前移一个字符
# Ctrl + H – 删除光标前一个字符
# N++F – 光标后移N个单词,N为1时可省略
# N++B – 光标前移N个单词,N为1时可省略
# Left-click-and-drag mouse: 选择并且拷贝到剪贴板。
# Click middle mouse button: 使用剪贴板的内容粘贴。
# Meta-key (Emacs terminology) 传统的是使用 Left-Alt-key
以上是Linux命令行编辑快捷键的方法。

GDB + gdbserver 远程调试android native code

分类: C/C++

 

以调试模拟器中的native library code为例。

Host: ubuntu
Target: Android ICS

1.将gdbserver放入设备。

确保系统有arm-*-gdb,及存在设备端将要运行的gdbserver,gdbserver可以由google ndk中获取,在ndk的如下目录可以找到这个文件:

 

点击(此处)折叠或打开

  1. android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt

 

然后,通过adb shell进入设备,在/data下创建bin 目录:

点击(此处)折叠或打开

  1. hanpfei@hanpfeiF6Ve:/mnt/android_proj/android_src$ adb shell
  2. # mkdir /data/bin/

 

再通过adb push命令将gdbserver 放入设备:

 

点击(此处)折叠或打开

  1. hanpfei@hanpfei-F6Ve:/mnt/android_proj/softwares/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt$ ls
  2. gdbserver linux-x86
  3. hanpfei@hanpfei-F6Ve:/mnt/android_proj/softwares/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt$ adb remount
  4. remount succeeded
  5. hanpfei@hanpfei-F6Ve:/mnt/android_proj/softwares/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt$ adb push gdbserver /data/bin/
  6. 543 KB/s (125208 bytes in 0.225s)

2、在设备端启动gdbserver并attach到所要debug的进程

 

点击(此处)折叠或打开

  1. system 1168 37 156620 31924 ffffffff 40011384 S com.android.keychain
  2. app_34 2758 37 158360 34572 ffffffff 40011384 S com.hanpfei.text
  3. root 2774 617 900 348 00000000 40010438 R ps
  4. gdbserver :1234 –attach 2758
  5. Attached; pid = 2758
  6. Listening on port 1234

 

gdbserver 后面跟的第一个参数为端口号,之后的–atach 为gdbserver的选项,之后的数字为所要调试的进程的PID。

3、在Host端启动arm-*-gdb

网上有高手build的各种交叉编译工具链来方便大家的嵌入式开发,单这个工具链中的gdb命令实际文件名称的前缀和后缀都会是相同的,中间的那个*可以见到各种各样的形式,比如linux,linux-androideabi,none-linux-gnueabi等等。

 

点击(此处)折叠或打开

  1. hanpfei@hanpfei-F6Ve:/mnt/android_proj/softwares/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin$ ./arm-linux-androideabi-gdb
  2. GNU gdb 6.6
  3. Copyright (C) 2006 Free Software Foundation, Inc.
  4. GDB is free software, covered by the GNU General Public License, and you are
  5. welcome to change it and/or distribute copies of it under certain conditions.
  6. Type “show copying” to see the conditions.
  7. There is absolutely no warranty for GDB. Type “show warranty” for details.
  8. This GDB was configured as “–host=i386-linux-gnu –target=arm-elf-linux”.
  9. (gdb) shell adb forward tcp:1234 tcp:1234
  10. (gdb) target remote localhost:1234
  11. Remote debugging using localhost:1234
  12. [New Thread 2758]
  13. Malformed packet(b) (missing colon): re:0;
  14. Packet: ‘T050b:7476b6be;0d:b874b6be;0f:84130140;thread:ac6;core:0;’
  15. (gdb)

使用ndk中所带的交叉编译工具链,会出现报错信息,意为畸形数据包: 

 

点击(此处)折叠或打开

  1. [New Thread 2758]
  2. Malformed packet(b) (missing colon): re:0;
  3. Packet: ‘T050b:7476b6be;0d:b874b6be;0f:84130140;thread:ac6;core:0;’

同时,在设备端也可以看到有如下的输出,来显示着这server端与client端难以协调的步调:

 

点击(此处)折叠或打开

  1. # gdbserver :1234 –attach 2758
  2. Attached; pid = 2758
  3. Listening on port 1234
  4. Remote debugging from host 127.0.0.1
  5. readchar: Got EOF
  6. Remote side has terminated connection. GDBserver will reopen the connection.
  7. Listening on port 1234

 

出现这样的状况,是由于gdbserver和arm-*-gdb版本不对应所致。由上面我们启动arm-linux-androideabi-gdb时的输出可以看到,其版本为GNU gdb 6.6。在设备上,我们可以查看gdbserver的版本信息:

 

 

点击(此处)折叠或打开

  1. gdbserver —version
  2. GNU gdbserver (GDB) 7.1-android-gg2
  3. Copyright (C) 2010 Free Software Foundation, Inc.
  4. gdbserver is free software, covered by the GNU General Public License.
  5. This gdbserver was configured as “arm-elf-linux”
  6. #

我们可以看到gdbserver版本为GNU gdbserver (GDB) 7.1-android-gg2。这也就是症结所在。 

我们可以换用和gdbserver版本较为接近的arm-*-gdb。此时在host端所需输入的命令及相应的输出如下:

 

点击(此处)折叠或打开

  1. hanpfei@hanpfei-F6Ve:~/develop_tool_chain/arm-2011.03/bin$ ./arm-none-linux-gnueabi-gdb
  2. GNU gdb (Sourcery G++ Lite 2011.03-41) 7.2.50.20100908-cvs
  3. Copyright (C) 2010 Free Software Foundation, Inc.
  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  5. This is free software: you are free to change and redistribute it.
  6. There is NO WARRANTY, to the extent permitted by law. Type “show copying”
  7. and “show warranty” for details.
  8. This GDB was configured as “–host=i686-pc-linux-gnu –target=arm-none-linux-gnueabi”.
  9. For bug reporting instructions, please see:
  10. <https://support.codesourcery.com/GNUToolchain/>.
  11. (gdb) shell adb forward tcp:1234 tcp:1234
  12. (gdb) target remote localhost:1234
  13. Remote debugging using localhost:1234
  14. 0x40011384 in ?? ()
  15. (gdb)
启动gdb,然后是执行shell命令(shell adb forward tcp:1234 tcp:1234) , 以完成端口映射的任务,靠前的那个为local端的端口,靠后的那个为remote端的。
于此同时,在设备端也将看到有如下的输出:

 

 

点击(此处)折叠或打开

  1. Listening on port 1234
  2. Remote debugging from host 127.0.0.1

这即是表明,gdb client端和server端有成功的链接。

 

接下来通过file命令来加载将要调试的可执行文件,对于android application来说,均为 out/target/product/generic/symbols/system/bin/app_process 这个文件,及设置搜索solib的搜索路径

点击(此处)折叠或打开

  1. (gdb) target remote localhost:1234
  2. Remote debugging using localhost:1234
  3. 0x40011384 in ?? ()
  4. (gdb) /mnt/android_proj/android_src/out/target/product/generic/symbols/system/bin/app_process
  5. Undefined command: “”. Try “help”.
  6. (gdb) file /mnt/android_proj/android_src/out/target/product/generic/symbols/system/bin/app_process
  7. A program is being debugged already.
  8. Are you sure you want to change the file? (y or n) y
  9. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/bin/app_process…done.
  10. (gdb) set solib-search-path /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib
  11. warning: Could not load shared library symbols for 3 libraries, e.g. /system/bin/linker.
  12. Use the “info sharedlibrary” command to see the complete listing.
  13. Do you need “set solib-search-path” or “set sysroot”?
  14. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libc.so…done.
  15. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libc.so
  16. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstdc++.so…done.
  17. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstdc++.so
  18. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libm.so…done.
  19. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libm.so
  20. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/liblog.so…done.
  21. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/liblog.so
  22. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libcutils.so…done.
  23. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libcutils.so
  24. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libz.so…done.
  25. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libz.so
  26. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libutils.so…done.
  27. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libutils.so
  28. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libbinder.so…done.
  29. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libbinder.so
  30. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libexpat.so…done.
  31. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libexpat.so
  32. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libcrypto.so…done.
  33. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libcrypto.so
  34. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libgabi++.so…done.
  35. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libgabi++.so
  36. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libicuuc.so…done.
  37. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libicuuc.so
  38. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libicui18n.so…done.
  39. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libicui18n.so
  40. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libssl.so…done.
  41. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libssl.so
  42. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstlport.so…done.
  43. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstlport.so
  44. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libnativehelper.so…done.
  45. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libnativehelper.so
  46. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libnetutils.so…done.
  47. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libnetutils.so
  48. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv2_dbg.so…done.
  49. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv2_dbg.so
  50. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libEGL.so…done.
  51. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libEGL.so
  52. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libwpa_client.so…done.
  53. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libwpa_client.so
  54. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libhardware_legacy.so…done.
  55. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libhardware_legacy.so
  56. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libpixelflinger.so…done.
  57. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libpixelflinger.so
  58. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libhardware.so…done.
  59. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libhardware.so
  60. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libemoji.so…done.
  61. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libemoji.so
  62. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libjpeg.so…done.
  63. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libjpeg.so
  64. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libskia.so…done.
  65. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libskia.so
  66. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libui.so…done.
  67. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libui.so
  68. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv2.so…done.
  69. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv2.so
  70. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libgui.so…done.
  71. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libgui.so
  72. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libcamera_client.so…done.
  73. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libcamera_client.so
  74. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libsqlite.so…done.
  75. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libsqlite.so
  76. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libdvm.so…done.
  77. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libdvm.so
  78. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv1_CM.so…done.
  79. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv1_CM.so
  80. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libETC1.so…done.
  81. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libETC1.so
  82. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libsonivox.so…done.
  83. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libsonivox.so
  84. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_foundation.so…done.
  85. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_foundation.so
  86. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libmedia.so…done.
  87. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libmedia.so
  88. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libnfc_ndef.so…done.
  89. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libnfc_ndef.so
  90. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libusbhost.so…done.
  91. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libusbhost.so
  92. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libharfbuzz.so…done.
  93. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libharfbuzz.so
  94. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libandroid_runtime.so…done.
  95. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libandroid_runtime.so
  96. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libvorbisidec.so…done.
  97. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libvorbisidec.so
  98. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_yuv.so…done.
  99. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_yuv.so
  100. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libdrmframework.so…done.
  101. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libdrmframework.so
  102. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libchromium_net.so…done.
  103. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libchromium_net.so
  104. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_amrnb_common.so…done.
  105. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_amrnb_common.so
  106. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_enc_common.so…done.
  107. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_enc_common.so
  108. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_avc_common.so…done.
  109. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright_avc_common.so
  110. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright.so…done.
  111. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libstagefright.so
  112. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libmtp.so…done.
  113. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libmtp.so
  114. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libexif.so…done.
  115. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libexif.so
  116. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libmedia_jni.so…done.
  117. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libmedia_jni.so
  118. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libbcc.so…done.
  119. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libbcc.so
  120. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libbcinfo.so…done.
  121. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libbcinfo.so
  122. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libRS.so…done.
  123. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libRS.so
  124. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/librs_jni.so…done.
  125. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/librs_jni.so
  126. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libandroid.so…done.
  127. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libandroid.so
  128. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libwebcore.so…done.
  129. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libwebcore.so
  130. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/lib_renderControl_enc.so…done.
  131. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/lib_renderControl_enc.so
  132. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv2_enc.so…done.
  133. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv2_enc.so
  134. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv1_enc.so…done.
  135. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libGLESv1_enc.so
  136. Reading symbols from /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libOpenglSystemCommon.so…done.
  137. Loaded symbols for /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib/libOpenglSystemCommon.so
  138. warning: Unable to find dynamic linker.
  139. GDB will be unable to debug shared library initializers
  140. and track explicitly loaded dynamic code.
  141. (gdb) set solib-absolute-prefix /mnt/android_proj/android_src/out/target/product/generic/symbols/system/lib
  142. warning: Unable to find dynamic linker.
  143. GDB will be unable to debug shared library initializers
  144. and track explicitly loaded dynamic code.
  145. (gdb)
此处所设置的路径下应该存在有编译好的带有符号的链接库文件,此处的设置,回事gdb读取这些库文件中的符号。可以通过directory命令来为gdb增加搜索原代码的路径。

之后,即可如调试PC端的C/C++ code一样,下断点,执行,查看内存内容,查看back trace等,来进行对library的debug工作: 

 

点击(此处)折叠或打开

  1. (gdb) break HB_ShapeItem
  2. Note: breakpoint 1 also set at pc 0x4094bf2c.
  3. Breakpoint 2 at 0x4094bf2c: file external/harfbuzz/src/harfbuzz-shaper.cpp, line 1340.
  4. (gdb) info break
  5. Num Type Disp Enb Address What
  6. 2 breakpoint keep y 0x4094bf2c in HB_ShapeItem(HB_ShaperItem*) at external/harfbuzz/src/harfbuzz-shaper.cpp:1340
  7. (gdb) continue
  8. Continuing.
  9. Breakpoint 2, HB_ShapeItem (shaper_item=0xbeb6729c) at external/harfbuzz/src/harfbuzz-shaper.cpp:1340
  10. 1340     if (shaper_item->num_glyphs < shaper_item->item.length) {
  11. (gdb) n
  12. 1338    {
  13. (gdb) s
  14. 1340     if (shaper_item->num_glyphs < shaper_item->item.length) {
  15. (gdb) list
  16. 1335    }
  17. 1336
  18. 1337    HB_Bool HB_ShapeItem(HB_ShaperItem *shaper_item)
  19. 1338    {
  20. 1339     HB_Bool result = false;
  21. 1340     if (shaper_item->num_glyphs < shaper_item->item.length) {
  22. 1341     shaper_item->num_glyphs = shaper_item->item.length;
  23. 1342     return false;
  24. 1343     }
  25. 1344     assert(shaper_item->item.script < HB_ScriptCount);
  26. (gdb)

 

 

gdb常用调试命令

0、查看程序源代码

directory(dir) DIR

Add directory DIR to beginning of search path for source files.Forget cached info on

          source file locations and line positions. DIR can also be $cwd for the current working directory, or $cdir for
          the directory in which the source file was compiled into object code.  With no argument, reset the search path
          to $cdir:$cwd, the default.

    show directories Current search path for finding source files.
    list
    List specified function or line. With no argument, lists ten more lines
    after or around previous listing. “list -” lists the ten lines before a
    previous ten-line listing. One argument specifies a line, and ten lines
    are listed around that line. Two arguments with comma between specify
    starting and ending lines to list. Lines can be specified in these ways:
      LINENUM, to list around that line in current file,
      FILE:LINENUM, to list around that line in that file,
      FUNCTION, to list around beginning of that function,
      FILE:FUNCTION, to distinguish among like-named static functions.
      *ADDRESS, to list around the line containing that address.
     set listsize Num Set number of source lines gdb will list by default.
     disassemble Disassemble a specified section of memory.

 

1、程序运行时参数。
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。

2、运行环境。
    path <dir>  Add directory DIR(s) to beginning of search path for object files.
show paths  Current search path for finding object files.
set environment VAR [=value] 设置环境变量。如:set env HOME=/home

    unset environment VAR Cancel environment variable VAR for the program.
show environment [varname] 查看环境变量。

3、工作目录。
cd <dir> 相当于shell的cd命令。
pwd 显示当前的所在目录。

4、程序的输入输出
info terminal 显示你程序用到的终端的模式。
使用重定向控制程序输出。如:run > outfile
tty命令可以指写输入输出的终端设备。如:tty /dev/ttyb

 

5、设置断点(BreakPoint)
我们用break命令来设置断点。正面有几点设置断点的方法:
break <function>
在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名。

    break <linenum> 在指定行号设置断点。

    break +offset
break –offset
在当前行号的前面或后面的offset行停住。offiset为自然数。

    break filename:linenum  在特定源文件filename的特定行linenum处设置断点。

    break filename:function 在源文件filename的function函数的入口处停住。

    break *address          在程序运行的内存地址处停住。

    break                   break命令没有参数时,表示在下一条指令处停住。

    break … if <condition>
…可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环体中,可以设置break if i=100,表示当i为100时停住程序。

    查看断点,可使用info命令,如下所示:(注:n表示断点号)
info breakpoints [n] 
info break [n] 

    delete Delete some breakpoints or auto-display expressions.

    disable Disable some breakpoints.

    enable Enable some breakpoints.

6、设置观察点(WatchPoint)
观察点一般用来观察某个表达式(变量也是一种表达式)的值是否有变化,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
watch <expr>       为表达式(变量)expr设置一个观察点。一旦表达式值有变化,马上停住程序。
rwatch <expr>      当表达式(变量)expr被读时,停住程序。
awatch <expr>      当表达式(变量)的值被读或被写时,停住程序。
info watchpoints   列出当前所设置了的所有观察点。

7、设置捕捉点(CatchPoint)

    可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。设置捕捉点的格式为:
catch <event>   当event发生时,停住程序。event可以是下面的内容:
1、throw 一个C++抛出的异常。(throw为关键字)
2、catch 一个C++捕捉到的异常。(catch为关键字)
3、exec 调用系统调用exec时。(exec为关键字,目前此功能只在HP-UX下有用)
4、fork 调用系统调用fork时。(fork为关键字,目前此功能只在HP-UX下有用)
5、vfork 调用系统调用vfork时。(vfork为关键字,目前此功能只在HP-UX下有用)
6、load 或 load <libname> 载入共享库(动态链接库)时。(load为关键字,目前此功能只在HP-UX下有用)
7、unload 或 unload <libname> 卸载共享库(动态链接库)时。(unload为关键字,目前此功能只在HP-UX下有用)

    tcatch <event> 设置一次捕捉点,当程序停住以后,相应捕捉点被自动删除。

 

8、运行程序

run(r) Start debugged program.。

continue(c) [ignore-count]

    fg [ignore-count]
恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示其后
忽略断点的次数。continue,c,fg三个命令都是一样的意思。

    step N  Step program until it reaches a different source line.

Argument N means do this N times (or till program stops for another reason).单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。

    next N
同样单步跟踪,如果有函数调用,他不会进入该函数。
后面的count参数可选,不加表示一条条地执行,加表示执行后面的count行code,然后再停住。

    kill Kill execution of program being debugged.

    set step-mode
set step-mode on
打开step-mode模式,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。

    set step-mod off  关闭step-mode模式。

    finish            运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。

    until(u)          这个命令可以运行程序直到退出循环体。

    stepi(si)
nexti(ni)

单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是“display/i $pc” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码).

9、查看表达式的值

   print EXP Print value of expression EXP.

   display EXP Print value of expression EXP each time the program stops.

   undisplay Cancel some expressions to be displayed when program stops.

   info display Expressions to display when program stops, with code numbers.

   whatis EXP Print data type of expression EXP.

   ptype TYPE Print definition of type TYPE.

   info locals Local variables of current stack frame.

10、查看Call Stack

   backtrace(bt)/where COUNT Print backtrace of all stack frames, or innermost COUNT frames.

frame Select and print a stack frame.

up Select and print stack frame that called this one.

down Select and print stack frame called by this one.

info args Argument variables of current stack frame.

11、Files

   file FILE Use FILE as program to be debugged.

   add-symbol-file FILE ADDR [-s <SECT> <SECT_ADDR> -s <SECT> <SECT_ADDR> …]

   Load symbols from FILE, assuming FILE has been dynamically loaded. ADDR is the starting address of the file’s text.

12、共享库

   sharedlibrary Load shared object library symbols for files matching REGEXP.

   info sharedlibrary Status of loaded shared object libraries.

   set solib-search-path Set the search path for loading non-absolute shared library symbol files.This takes precedence over the environment variables PATH and LD_LIBRARY_PATH.

   set solib-absolute-prefix Set an alternate system root. The system root is used to load absolute shared library symbol files.

13、Support

   shell Execute the rest of the line as a shell command.

   source [-s] [-v] FILE Read commands from a file named FILE.用于执行gdb调试脚本

   dump memory FILE START STOP Write contents of memory to a raw binary file. Writes the contents of memory within the range [START .. STOP) to the specifed FILE in raw target ordered bytes.

   info threads IDs of currently known threads.

   thread thread_ID Use this command to switch between threads. The new thread ID must be currently known.

   target remote ip:port Use a remote computer via a serial line, using a gdb-specific protocol. Specify the serial device it is connected to

 

gdb的help命令可帮助提供相关命令非常详细的说明。

gdb的命令比较多,陈皓老师专栏有更详细的说明:http://blog.csdn.net/haoel/article/list/7