dSYM atos crash log 定位到代码行的方法(转)
做iOS开发的时候,常常会遇到crash,需要分析call stack的时候。
有时候App在别人的设备崩溃,把crash report在自己的机器上打开,Xcode没有自动的进行符号化。
这时候就需要自己去把地址解析成符号。
大前提是,必须有相同版本App对应的.dSYM文件。
这时候打开Terminal,进入到build/Debug-iphoneos
使用命令:
$atos -arch arm7 -o XXX.app/XXX 0xabcdef
XXX是你的App名字,用需要解析的地址替换上面的0xabcdef
arm7是编译App时所用的Architecture,也可能是arm6,如果在simulator上的App,这个位置应该用i386
http://stackoverflow.com/questions/5175990/ambiguous-iphone-crash-report
搞iPhone开发就要不停地发版本,随之而来的就是各种版本的crash log。如果不能好好地管理,那么开发人员很快就会在crash log和版本的海洋里迷失方向。
MAC上有个免费的小工具——dwarfdump,可以简便地检测出app和相应的dSYM。
使用起来很简单。分三步即可。
1> 根据crash log,得到App的UUID。UUID是个字符串,由32个字符组成。得到了UUID,你才能知道是你的哪个版本在用户的iPhone上出了问题。
2> 使用dwarfdump检查app,看哪个app是上面那个UUID。命令行格式:
dwarfdump --uuid YourApp.app/YourApp
3> 用dwarfdump检查dSYM文件是否是上面的UUID。命令行格式:
dwarfdump --uuid YourApp.app.dSYM
如果三者的UUID都是一致的,那么恭喜你,该crash log可以被正确解析出来,stack traces信息可以被正确地拿到。
当你编译一个Objective-C程序时,代码被转换成2进制文件。但是和Java等其它语言不同,编译无法通过时,没法看出是哪里出的问题。但是,编译时会生成一个dSYM包。它能把编译崩溃报告和代码匹配起来,从而确定问题所在。
问题是dSYM包必须和二进制文件匹配,所以每次代码重建和版本变化时都要附带重建dSYM包。这可够麻烦的。为此我写了个脚本,它能把dSYM包移入文件目录里,生成一个叫“dSYM”的目录项。此外,该脚本还能检查并保存GIT里的包。为了防止2个包重名,脚本以生成时间来命名每个dSYM包。
故障检查
脚本的第一任务是检查能否调试。
if [ "$BUILD_STYLE" == "Debug" ]; then
echo "Skipping debug"
exit 0;
fi
脚本的第一部分是
检查该版本能否调试
。其实文件还在开发者电脑上,代码也都在,这一步可以略过了。
if [ "$EFFECTIVE_PLATFORM_NAME" == "-iphonesimulator" ]; then
echo "Skipping simulator build"
exit 0;
fi
第二步是检查版本兼容性,先不管储存代码的事。
移动文件
既然dSYM是以生成时间命名的,并且可以在开发者之间以及电脑间迁移,我把环境变量加入到文件里。
SRC_PATH=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}
RELATIVE_DEST_PATH=dSYM/${EXECUTABLE_NAME}.$(date +%Y%m%d%H%M%S).app.dSYM
DEST_PATH=${PROJECT_DIR}/${RELATIVE_DEST_PATH}
echo "moving ${SRC_PATH} to ${DEST_PATH}"
mv "${SRC_PATH}" "${DEST_PATH}"
下一步就是建立文件当前位置到转存位置的路径。最好把路径存下来,出问题时好查看。
提交到版本控制
忙了半天,就是为了这个版本控制啊。
if [ -f ".git/config" ]; then
git add "${RELATIVE_DEST_PATH}"
git commit -m "Added dSYM file for ${BUILD_STYLE} build" \
"${RELATIVE_DEST_PATH}"
fi
只有当项目是GIT包的一部分时才触发最后这部分代码。
首先需要两个东西:
1、崩溃报告 .crash文件
这个从手机上可以找到,通过Organizer可以导入导出
其实需要这个文件,主要是为了找到崩溃时的栈
友盟统计的报告中,是没有.crash文件的,只有栈信息,所以也足够
2、该应用的 .dSYM文件
这个文件和你编译的应用二进制文件是一一对应的
在你编译的app文件同目录下就能找到
不过也不必担心上传应用到app store时的那个对应的.dSYM没保存
在XCode4以后,有个archive功能,一般上传应用前都会archive下
在Organizer中找到相应的archive文件,查看包内容,里面有我们需要的.dSYM文件
两个东西准备好后执行这个命令
- atos -o /MyApp.dSYM/Contents/Resources/DWARF/MyApp -arch armv7 0x99999999
三点说明:
1、/MyApp.dSYM/Contents/Resources/DWARF/MyApp
就是那个.dSYM包(其实.dSYM是个包,不是二进制文件)中的文件路径
MyApp换成你的应用名称即可
2、armv7
根据你的应用,选择6或7
3、0x99999999
这个是在崩溃记录中的代码地址
就是函数的入口地址
执行后,会显示相应的函数名
因为是根据调用栈算出来的,所以只能定位到函数,无法定位到具体代码行
记得马丁福勒的“重构书”吗?里面一直强调“小函数”
这里为他提供了一个论据 http://stackoverflow.com/questions/4604843/crash-log-in-device 转自:http://blog.sina.com.cn/s/blog_489ab04e010157pg.html
dSYM atos crash log 定位到代码行的方法(转)的更多相关文章
- VS2008通过 map 和 cod 文件定位崩溃代码行
VS 2005/2008使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一 ...
- Android 常用工具类之LogUtil,可以定位到代码行,双击跳转
package cn.utils; import android.util.Log; public class LogUtils { public static boolean isDebug = t ...
- iOS定位到崩溃代码行数
不知道大家是不是在代码调试过程中经常遇到项目崩溃的情况: 比如: 数组越界: 没有实现方法选择器: 野指针: 还有很多很多情况.......昨天学到了一种可以直接定位到崩溃代码行数的一个命令,记录一下 ...
- 如何在Vue项目中,通过点击DOM自动定位VScode中的代码行?
作者:vivo 互联网大前端团队- Youchen 一.背景 现在大型的 Vue项目基本上都是多人协作开发,并且随着版本的迭代,Vue 项目中的组件数也会越来越多,如果此时让你负责不熟悉的页面功能开发 ...
- iOS crash log 解析 symbol address = stack address - slide 运行时获取slide的api 利用dwarfdump从dsym文件中得到symbol
概述: 为什么 crash log 内 Exception Backtrace 部分的地址(stack address)不能从 dsym 文件中查出对应的代码? 因为 ASLR(Address spa ...
- dump文件定位程序崩溃代码行
1.dump文件 2.程序对应的pdb 步骤一:安装windbg 步骤二:通过windbg打开crash dump文件 步骤三:设置pdb文件路径,即符号表路径 步骤四:运行命令!analyze -v ...
- 使用MAP文件快速定位程序崩溃代码行 (转)
使用MAP文件快速定位程序崩溃代码行 =========================================================== 作者: lzmfeng(http://lz ...
- 记-统计svn与git的log日志中的代码行变更
任务要求 统计指定时间内,指定git地址与svn地址上的所有人员的代码行变更情况. 解决方案 最初为根据数据库中存储的所有git与svn地址来统计所有人员的提交代码行.之后由于库中存储的地址不全,改为 ...
- shell脚本实现git和svn统计log代码行
实现的功能 git 根据传入的三个参数:起始统计日期.结束统计日期.git仓库地址. 脚本统计的是git仓库内的所有分支的log信息. 脚本统计的是指定时间段内.每一个提交人指定的git地址的所有分支 ...
随机推荐
- 在ASP.NET MVC5中建置以角色为基础的授权机制
在前一篇贴文中,已探索过如何在MVC5中自定ASP.NET Identity,接下来要来试试在MVC5中如何运用 ASP.NET Identity来设定一个以 "角色"为基础的授权 ...
- paip.c3p0 数据库连接池 NullPointerException 的解决...
paip.c3p0 数据库连接池 NullPointerException 的解决... 程序ide里面运行正常..外面bat运行错误.. 作者Attilax 艾龙, EMAIL:14665198 ...
- paip.元数据驱动的转换-读取文件行到个list理念 uapi java php python总结
paip.元数据驱动的转换-读取文件行到个list理念 uapi java php python总结 #两个思路 1.思路如下:使用file_get_contents()获取txt文件的内容,然后通过 ...
- MyEclipse使用总结——设置MyEclipse开发项目时使用的JDK
安装好MyEclipse之后,在MyEclipse中开发项目时,默认使用的是MyEclipse是自带的JDK,如下图所示: 如果我们需要使用自己安装好的JDK,那么就需要在MyEclipse中重新设置 ...
- Hibernate入门3.配置映射文件深入
Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...
- 电子病历,到底是用BS还是CS
电子病历,到底是用BS还是CS 袁永福 2014-8-19 前言:前几天下午去开发医疗软件的S公司,旁听了他们的内部技术讨论会议.他们目前的电子病历是B/S架构,会上一群人讨论起用C/S重构电子病历系 ...
- emoji表情引发的JNI崩溃
今天突然接到客服那边的反馈说,有玩家反馈进游戏后不久就崩溃了,我先是怀疑网络问题,因为一连接聊天成功后就挂了.之后用logcat抓日志,发现挂在jni那里了 JNI DETECTED ERROR IN ...
- 最近碰到了一个病毒木马:virus.win32.ramnit.B
由于 使用了 简单游 平台上的挂机工具: 番茄-自动人机对战免费版1217 ,使用了很久,头段时间家里电脑 360提示有病毒,本来我一直忽略的,但 我扫描了一下,大量的这个木马,于是 吧 简单游卸载 ...
- Windows中搭建已存在的Octopress环境
// 当我们需要在不同的电脑上来对同一个Octopress博客进行维护的时候就需要针对已存在的Octopress来设置环境了, 安装相应的软件 Git:http://msysgit.googlecod ...
- 集群: 如何在spring 任务中 获得集群中的一个web 容器的端口号?
系统是两台机器, 跑四个 web 容器, 每台机器两个容器 . nginx+memcached+quartz集群,web容器为 tomcat . web 应用中 用到spring 跑多个任务,任务只能 ...