lldbの練習として、AppleのmacOS TextEdit.appにlldbを付けてシンボリックブレークポイントを設定しようとしています。私はFoundationクラスでブレークポイントを設定することができます。しかし、プライベートクラスでは、私はいつも得ているようです実際の場所にブレークポイントを解決できません。なぜですか?lldb private Objective-Cクラスの "breakpointsを解決できません"
私は、出荷された実行ファイルは削除されていることを理解していますが、Objective-Cのシンボル名を削除することはできません。また、古いアプリケーションを「クラック」する方法を説明する古い記事をいくつか読んで、 gdbでまた、TextEdit実行ファイルにotool -ov
を実行すると、すべてのプライベートシンボルとそのアドレスが表示されます。
例
が、それは基礎クラスのためにうまく動作方法を参照してください:
(lldb) breakpoint set -F "-[NSString initWithFormat:]"
Breakpoint 1: where = Foundation`-[NSString initWithFormat:], address = 0x00007fff2c0c29d0
(lldb) breakpoint set -r '\[NSString .*\]$'
Breakpoint 2: 139 locations.
しかし、私はプライベートDocument
クラスで、または私が見つけたその方法の一つで同じことをしようとすると、それが失敗しましたスティーブNygårdののclass-dump使用して:現時点では
(lldb) breakpoint set -F "-[Document validateMenuItem:]"
Breakpoint 3: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
(lldb) breakpoint set -r '\[Document .*\]$'
Breakpoint 4: no locations (pending).
WARNING: Unable to resolve breakpoint to any actual locations.
ありがとう、@ジムインガム。あなたはこれがlldbに実装されていない機能だと言っていますか?それはgdbで実装されましたか? –
otoolレポートの対象メソッドのアドレスを取得し、そのアドレスにブレークポイントを設定することで理論的に回避できますか? –
最初の質問ですが、私たちはAppleのgdbにObjCランタイムデータを何らかの目的のために読むよう教えたことはありません。私はFSF gdbがこれを行うとは思わない。私は確かにこれをlldbに追加することができましたが、現在私は計画はありません。この機能を追加するために投票したい場合は、Appleのバグ報告者に報告してください。 –