关于XCode编译完App之后生成的dSYM文件

转转:http://www.cocoachina.com/macdev/cocoa/2010/0427/1222.html

在XCODE编译项目之后,会在app旁看见一个同名的dSYM文件.
他是一个编译的中转文件,简单说就是debug的symbols包含在这个文件中.

他有什么作用? 当release的版本 crash的时候,会有一个日志文件,包含出错的内存地址, 使用symbolicatecrash工具能够把日志和dSYM文件转换成可以阅读的log信息,也就是将内存地址,转换成程序里的函数或变量和所属于的 文件名.

有一篇详细的blog讲了这个过程

http://www.anoshkin.net/blog/2008/09/09/iphone-crash-logs/

将类似

Thread 0 Crashed:
0 libobjc.A.dylib 0×300c87ec 0×300bb000 + 55276
1 MobileLines 0×00006434 0×1000 + 21556
2 MobileLines 0×000064c2 0×1000 + 21698
3 UIKit 0×30a740ac 0×30a54000 + 131244

的log信息转换成

Thread 0 Crashed:
0 libobjc.A.dylib 0×300c87ec objc_msgSend + 20
1 MobileLines 0×00006434 -[BoardView setSelectedPiece:] (BoardView.m:321)
2 MobileLines 0×000064c2 -[BoardView touchesBegan:withEvent:] (BoardView.m:349)
3 UIKit 0×30a740ac -[UIWindow sendEvent:] + 264

的有用信息.

工具symbolicatecrash隐藏在/Developer/Platforms/iPhoneOS.platform/Developer /Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash

所以一般复制到/usr/local/bin/ 成为命令行直接调用

$ sudo cp /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash /usr/local/bin/

这个时候运行

$ symbolicatecrash -h

就能看见帮助信息了.

这个时候,问题又来了..每次编译后的dsym文件都要手动保存一次,很是麻烦.

于是有人写了一个脚本,自动在编译后保存该文件.
请参考:

http://www.cimgf.com/2009/12/23/automatically-save-the-dsym-files/

脚本我复制过来在下面

#!/bin/sh

if [ "$BUILD_STYLE" == "Debug" ]; then
echo “Skipping debug”
exit 0;
fi

if [ "$EFFECTIVE_PLATFORM_NAME" == "-iphonesimulator" ]; then
echo “Skipping simulator build”
exit 0;
fi

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

————————————————————
XCode开发技巧之UserScripts使用
XCode作为一款强大的IDE,当然也支持脚本功能。通过添加自己的脚本我们可以很方便的完成我们的工作。在XCode中点击 Edit User Scripts即可方便的添加脚本,而且XCode自带的脚本也相当于给我们提供了丰富的样例。比如我们添加一个这样的脚本,并为其添加一个快捷键??P(快捷键添加方法参考Comments分类中的Un/Comment Selection脚本)
1.        #!/bin/sh  
2.           
3.        echo "%%%{PBXSelection}%%%"  
4.        echo "#pragma mark -"  
5.        echo "#pragma mark %%%{PBXSelectedText}%%%"  
6.        echo "%%%{PBXSelection}%%%" 
注意在Output下拉列表中选择Replace Selection。这个脚本的作用是方便我们建立#pragma,首先提供pragma的名字,然后选中这个名字,按相应快捷键,#pragma就自动完成了,很方便。
这个脚本也可以这样写,我们就不用每行都写echo了
1.        #!/bin/sh  
2.           
3.        cat << EOF 
4.        %%%{PBXSelection}%%%  
5.        #pragma mark -  
6.        #pragma mark %%%{PBXSelectedText}%%%  
7.        %%%{PBXSelection}%%%  
8.        EOF 
除了bash脚本,XCode还支持Ruby,Python等多种语言的脚本,比如这个Ruby脚本
1.        #!/usr/bin/env ruby -w
2.        # Source: [url=http://allancraig.net/blog/?p=315]http://allancraig.net/blog/?p=315[/url] 
3.        properties = '' 
4.        synthesize = '' 
5.        release    = '' 
6.        STDIN.read.each do |line  
7.            line.gsub!(/\*/, '').strip!  
8.            words = line.split(/\s+/)  
9.            label = words.size > 2 ? words[1] : words[0]  
10.            variable = words[-1]  
11.            properties << "@property (nonatomic, retain) IBOutlet #{label} *#{variable}\n"  
12.            synthesize << "@synthesize #{variable}\n"  
13.            release << "[#{variable.chop} release];\n"  
14.        end  
15.        synthesize << release.chomp 
16.        `echo '#{synthesize.chomp}' | pbcopy`  
17.        print properties.chomp 
该脚本的作用是帮助我们添加@property、@synthesize、还有dealloc方法中相应的release。使用方法是选中.h文件中的成员变量,比如我们选中UIButton *aButton;,复制到要添加@property的位置,再次选中,按快捷键执行脚本,@property就添加完成了,然后到相应的.m文件中,在要添加@synthesize的位置按?V粘贴,@synthesize也添加好了,同时复制过来的还有[aButton release];,选中这行,剪切粘贴到dealloc方法中,大功告成。使用这个脚本不仅可以快速添加@property @synthesize,同时也避免了变量名写错所造成的一些问题。

你可能感兴趣的:(关于XCode编译完App之后生成的dSYM文件)