少し古いのですが、macOS sierra上でOpenSSL098のデバッグをしたいと思いましたが、vanillaな環境では当然ながらdSYMは入手できません。そこで、自前ビルドしたOpenSSL098を使ってlldbでソースレベルデバッグができたので、備忘録として挙げてみました。
追記1:High SierraではdSYMもライブラリと同じパスにインストールすることで対応できるようです。
まず、OpenSSL098をdSYM付でビルドさせます。opensslプロジェクトを選択し、Build Settingsでdsymを検索すると"Debug Information Format"の項目がでてくるので、"DWARF with dSYM File"とします。さらにOpenSSL098を自前ビルドするには、以下の変更が必要です。
(注:サンプルコードは一部編集しています。)
1. ライブラリをdSYM付でビルドして/usr/local/libなどにdSYMを含めてインストールし、既存のライブラリと干渉しないようにしておく。
2. 独自ビルドしたライブラリをつかってプログラムをビルド。
3. DYLD_LIBRARY_PATHでデバッグ対象libraryの場所を指定して lldbを起動。
ということになります。今回は以上です。それでは。
追記1:High SierraではdSYMもライブラリと同じパスにインストールすることで対応できるようです。
まず、OpenSSL098をdSYM付でビルドさせます。opensslプロジェクトを選択し、Build Settingsでdsymを検索すると"Debug Information Format"の項目がでてくるので、"DWARF with dSYM File"とします。さらにOpenSSL098を自前ビルドするには、以下の変更が必要です。
# 1. source code内の openssl.xcodeproj/project.pbxprojからx509_vfy_appleを含む行を削除する(viを使うと簡単に削除できます) # 2. src/crypto/x509/x509_vfy.cの以下の部分をコメントにするかあるいは削除する #ifdef __APPLE__ #define X509_verify_cert X509_verify_cert_orig #endif続いてビルドですが、$t/SourceCache/$p/$p-$v以下にソースコードを展開し、xcodebuildをつかっておよそ以下のようにビルドしました。
export SDKPATH="$(xcrun --sdk macosx10.12 --show-sdk-path)" export SDKROOT=$SDKPATH export TOOLCHAINPATH=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain export TOOLCHAIN=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain export sdk=macosx10.12 export i=$SDKPATH export BD=/Volumes/DEV-01 export BN=16G29 export t=$BD/$BN/BuildRoot export d=$BD/$BN/MiniRoot export w=$t/private/var/tmp export x=$BD/$BN export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer #export dbshare=/usr/local/share/darwinbuild export dbshare=/opt/local/share/darwinbuild export DARWIN_BUILDROOT=$x # cd $x # hdiutil attach .build/buildroot.sparsebundle -readwrite -owners on p=OpenSSL098 v=64.50.6 cd $t/SourceCache/$p/$p-$v xcodebuild -sdk macosx10.12 SDKROOT=$SDKPATH "ARCHS=x86_64" \ "SRCROOT=$PWD" "OBJROOT=$w/$p/$p-$v.obj" "SYMROOT=$w/$p/$p-$v.sym" "DSTROOT=$w/$p/$p-$v.root" \ "RC_ProjectName=$p" "RC_ProjectSourceVersion=$v" "RC_ProjectNameAndSourceVersion=$p-$v" \ "RC_ProjectBuildVersion=6" "INSTALLED_PRODUCT_ASIDES=YES" "NEXT_ROOT=" \ "RC_OS=macos" "RC_PRIVATE=/private" "RC_RELEASE=Sierra" "RC_TARGET_CONFIG=MacOSX" \ "RC_XBS=YES" "SEPARATE_STRIP=NO" "UNAME_RELEASE=10.12" "UNAME_SYSNAME=Darwin" \ OTHER_CFLAGS="$OTHER_CFLAGS -msse4 -msse4.1 -mno-sse4.2" installビルドに成功すると$w/$p以下に成果物が生成されますので、以下のようにします。
sudo su ls $w/$p # OpenSSL098-64.50.6.obj OpenSSL098-64.50.6.root OpenSSL098-64.50.6.sym mkdir -p /usr/local/lib cp -a $w/$p/OpenSSL098-64.50.6.root/usr/lib/lib* /usr/local/lib/ cp -a $w/$p/OpenSSL098-64.50.6.root/usr/lib/lib*dSYM /usr/local/lib/ mkdir -p /usr/local/include cp -a $w/$p/OpenSSL098-64.50.6.root/usr/local/include/* /usr/local/include/次にサンプルプログラムを上述のファイルをつかってビルドします。なお、サンプルコードはこちらから取得しました。ありがとうございます。Thank you!!
(注:サンプルコードは一部編集しています。)
mkdir ~/sslconnect cd ~/sslconnect gcc -g sslconnect.c -o sslconnect -L/usr/local/lib -lssl -lcrypto -I/usr/local/includeワーニングがでますが、実行には問題ないので早速lldbで以下のようにデバッグさせます。
#defaults write com.apple.security.cs.allow-dyld-environment-variables -bool true #defaults write com.apple.security.cs.disable-library-validation -bool true DYLD_LIBRARY_PATH=/usr/local/lib lldb sslconnect (lldb) target create "sslconnect" Current executable set to 'sslconnect' (x86_64). (lldb) b sslconnect.c:100 Breakpoint 1: where = sslconnect`main + 418 at sslconnect.c:100, address = 0x00000001000015e2 (lldb) run Process 10357 launched: '/var/root/sslconnect/sslconnect' (x86_64) Successfully made the TCP connection to: https://www.google.com. Process 10357 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 frame #0: 0x00000001000015e2 sslconnect`main at sslconnect.c:100 97 /* ---------------------------------------------------------- * 98 * Try to SSL-connect here, returns 1 for success * 99 * ---------------------------------------------------------- */ -> 100 int conn = SSL_connect(ssl); 101 102 if ( conn != 1 ) 103 { Target 0: (sslconnect) stopped. (lldb) s libssl.0.9.8.dylib was compiled with optimization - stepping may behave oddly; variables may not be available. Process 10357 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = step in frame #0: 0x00000001000c6b59 libssl.0.9.8.dylib`SSL_connect(s=0x0000000100316110) at ssl_lib.c:875 [opt] 872 873 int SSL_connect(SSL *s) 874 { -> 875 if (s->handshake_func == 0) 876 /* Not properly initialized yet */ 877 SSL_set_connect_state(s); 878 Target 0: (sslconnect) stopped. (lldb)長々となりましたが、要は
1. ライブラリをdSYM付でビルドして/usr/local/libなどにdSYMを含めてインストールし、既存のライブラリと干渉しないようにしておく。
2. 独自ビルドしたライブラリをつかってプログラムをビルド。
3. DYLD_LIBRARY_PATHでデバッグ対象libraryの場所を指定して lldbを起動。
ということになります。今回は以上です。それでは。
コメント
コメントを投稿