安卓源码打trace的方法_安卓trace工具

hacker|
91

文章目录:

使用Frida-trace注入分析app

使用MonkeyDev也能实现注入分析app中的函数、方法等,但每次一丁点修改就需要重新在xcode里编译,而且某些app经过重签名或是修改bunldID之后无法正常使用,所以,我们直接从越狱机上注入到其原始app中进行分析,类似cycript做的事情。

记录几个常用的参数用法:

frida-trace:-U 表示USB连接

-f 表示启动某个进程(后面跟着应用的bundleId)

-m 对Object-C的方法进行追踪(你也可以叫Hook),后面可以跟各种模糊匹配等等

-i 对C函数进行追踪

例子:

ps:*表示任意的意思

这样操作之后,会在当前命令行所在的目录生成一个 handle 目录,里面就存放了一系列的js文件,每个js文件就是一个方法函数的对应,如果我们需要对某个方法函数进行参数打印、参数改变等,直接修改对应的这个js文件保存,然后重新frida-trace启动应用,当执行到该方法函数时就能在命令行窗口中打印出相关信息。

如何编写这样的js文件?好问题!请参考frida官网有详细的解说:

参考文章:

手机trace文件怎么打开

爱应用为您解答:

第一步:设置一个新的外部配置工具

在 Eclipse 中,选择 “Run - External Tools - External Tools Configurations”

第二步:点击 “New Launch Configuration”

第三步:New Configuration 界面

第四步:提供命令行配置的详细信息

Name:就是你配置的名字,随便取

Location:CMD.exe 的文件位置

Working Directory:就是命令行打开后的默认工作路径

如何对Android的本地代码进行profiling

现在用Android native code写程序库的人越来越多。对于那些需要写的库实时性要求特别强的应用,通过profiling来进行优化是一个非常有用的特性,因为它能帮你理解程序编译后的本质,比如多少instruction,哪些method调用多少次,多长时间,等等。

Android开发环境提供了Traceview这样一个工具,可以点到这个链接里面去看官方对他的介绍。总的来说,就是它提供给程序开发者目标程序的执行日志,以此帮助你调试程序和优化性能。有两种方法能够声称traceview所需的log,一种是利用DDMS的profiling特性,通过控制什么时候开始和结束logging来获得log。这个方法在你没有程序源代码的时候有用,因为只需要Run程序就能获得log信息,但是没有精准的起始中止控制。另一种是通过将Android自带的Debug类加到code中,然后调用里面的method来开始和中止trace信息的纪录。这个方法能让开发者非常精准地控制什么时候开始纪录,什么时候结束纪录,因为开始和技术都是在code中执行的。

对于Java程序来说,官方网页介绍了一个标准流程,就是在程序中引入Debug类,然后在你想要开始纪录profiling信息的时候调用startMethodTracing(),然后在准备结束的时候调用stopMethodTracing()方法。纪录的log文件默认放在sdcard中。

然而对于本地native代码,该方法就无效了。原因是这个方式只能trace你的java层的方法和其对Android API的调用,却无法trace Android API背后的那些方法,也无法trace你自己写的native code。如果你希望trace这些更底层的代码,就需要用Debug类提供的Debug.startNativeTracing()和 Debug.stopNativeTracing()。而且,这个配对只能工作的虚拟机emulator中,因为只有trace qemu emulator,才能去trace每一个进程的每一条cpu指令,甚至包括内核的代码,我们也才能获得更多的信息比如context switch,cache misses。

下面就来看看,利用该方法对来profile native code是怎样一个流程:

1. 新建一个Android Virtual Device,给一个名字,比如Profile。可以在AVD manager中创建。

2. 在命令行中通过命令”emulator -avd -trace

” 来运行该AVD。比如emulator -avd Profile -trace myTrace。

3. 将startNativeTracing()和stopNativeTracing()添加到你想profile的代码中。

4. 在Eclipse中build代码,确保没有错误。安装到正在运行的AVD中。

5. 去AVD中运行代码,确保你希望trace的代码段正常运行了。如果你观察运行AVD的那个terminal的窗口,应该会有比如“–start tracing–” 和 “–stop tracing–”这样的消息出现,这就说明代码正常运行了。

6. App运行完毕后,退出emulator。

7. 去你的用户目录找trace文件。这个目录是存储你AVD settings的目录,默认一般都在/Home/User/.android/avd/下。这个User是你自己的用户名,如果你是用的Mac或者Linux,这个路径也就是~/.android/avd。

8. 找到和你AVD名字对应的文件夹,里面有另一个子文件夹,命名就是你的trace名字,比如这里就是myTrace。里面的文件包括:

qtrace.bb

qtrace.exc

qtrace.insn

qtrace.method

qtrace.pid

qtrace.static

9.你需要用tracedmdump这个工具来将这些文件转化为符合Traceview格式的文件。问题在于,坑爹的Android SDK/NDK环境不原生提供这个工具。所以……..请看下一步

10. 好吧,这个工具来自于Android的源代码环境。那我们需要做的,就是下载整个Android源代码,编译。这个过程通常会持续……一个小时以上。请参考官方手册来进行编译。如果你使用的是Linux,恭喜你,什么别的资料都不用找,就一步一步按照手册来就行了。如果你是Mac用户……哥们,还是按照官方手册来吧,但过程就听天由命了。

11. Okay,假设到这里,你已经完成了整个Android源代码的编译。接下来,在源代码的根目录下运行“source build/envsetup.sh”,然后将根目录下的/out/host/xxxx/bin加到PARH路径中。xxx表示你的编译平台。这下你就可以run tracedmdump了。开一个终端,执行“tracedmdump ~/.android/avd/Profile/myTrace/”,tracedmdump去分析刚才那些五花八门的二进制文件,挖掘里面的symbolic信息,然后将其和trace数据对应。等一小会,就可以得到instruction的信息,并会生成一个更详细的包括所有profiling信息的html文档,这个文档和Traceview兼容的,可以直接打开,也可以用Traceview工具分析。

这样,整个profiling过程就结束了。

需要注意一点的是,这个方法和method tracing比有一个局限,就是因为工作在真实设备上,所以emulator不能模拟所有的真实设备效果,比如memory contention和bus contention,同时也无法模拟真实的cache效果,因为emulator中的cache设计是大大简化了的。

你好,Android程序打印出native trace, c 语言层面有没有好的方法?多谢哈

String _thisMethodName = new Exception().getStackTrace()[0].getMethodName();// 获得当前的方法名

System.out.println(_thisMethodName);

需要其它信息,可以跟踪查看一下new Exception().getStackTrace()方法的返回值。

trace-a怎么打命令

使用 tracert 怎么打命令

Tracert(跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径。Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。

Tracert 工作原理

通过向目标发送不同 IP 生存时间 (TTL) 值的“Internet 控制消息协议 (ICMP)”回应数据包,Tracert 诊断程序确定到目标所采取的路由。要求路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1。数据包上的 TTL 减为 0 时,路由器应该将“ICMP 已超时”的消息发回源系统。

Tracert 先发送 TTL 为 1 的回应数据包,并在随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL 过期的数据包,这在 Tracert 实用程序中看不到。

Tracert 命令按顺序打印出返回“ICMP 已超时”消息的路径中的近端路由器接口列表。如果使用 -d 选项,则 Tracert 实用程序不在每个 IP 地址上查询 DNS。

在下例中,数据包必须通过两个路由器(10.0.0.1 和 192.168.0.1)才能到达主机 172.16.0.99。主机的默认网关是 10.0.0.1,192.168.0.0 网络上的路由器的 IP 地址是 192.168.0.1。

【log4j】logger.isTraceEnabled()

我们经常可以看到,在使用日志框架时,会有如下写法:

为什么要这样写呢?这样写有什么好处?

首先我们来看下这两个方法的源码:

我们可以看到,在使用trace方法打印日志时,会有与isTraceEnabled方法中一样的方法调用,也就是说等同于在trace中调用了isTraceEnabled方法。

那么为什么我们在使用时还要在外层进行一次判断呢?

官方的说法是:出于效率考虑,看具体情况而定。

我们就以下两种情况进行分析:

对于这种情况,则完全没有必要在外层进行筛选判断。

对于这种情况,则需要考虑考虑了。如果getTotal()方法是一个较为复杂的、计算量庞大的方法,则在外层进行一下判断就是很有必要的了。无论当前系统的日志级别为哪一等级,程序程序都会调用debug方法,会执行getTotal方法,只不过最后的结果可能是不打印日志而已(日志级别为info或更高)。debug中调用这个方法会消耗较大资源,得不偿失。

1条大神的评论

  • avatar
    访客 2022-12-20 上午 01:39:58

    达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。某些路由器不经询问直接丢弃 TTL 过期的数据包,这在 Tracert 实用程序中看不到。 Tracert 命令按顺序打

发表评论