2016-10-07 14 views
3

私は大きなプロジェクト> 100k locをステップアップしようとしていますが、libとのやりとりのみを気にします。一度のソースファイルですべての関数宣言を破るlldbを得る方法はありますか?lldb - cppファイル内のすべての関数のブレークポイントを設定する方法

は、これまでのところ私はgdb to lldbgdb solutionからの情報で

br s -f <file> --func-regex .* 

をやってみましたが、それは4911行のソースファイルの5129試合を起こしファイル内のすべての関数呼び出しに破壊されているようです。

可能な解決策は、関数呼び出しを見つけるために、ソース正規表現マッチングを実行することができ介し

BR S -f --source-パターン正規表現

が、所与のC++のばかげた解析ルール、すべての一致正規表現ケースは不可能です。

+0

関数のリストをブレークコマンドとしてファイルに入れることができます。ヘッダーファイルから簡単に作成する必要があります。 gdbを-xフラグで実行する: 'gdb -x command_file_name' – bruceg

+0

問題は、より一般的な解決策が必要であり、ヘッダーの関数を破ることが、関数がヘッダーに宣言されていないケースを適切にカバーしていないことです。それがソースファイルで宣言され、関数ポインタとして渡されたときです。 –

+0

幸運。あなたが把握していることをお知らせください。 – bruceg

答えて

2

-f仕様は本当に<file>によって定義されたコンパイル単位にブレークポイントの検索を制限し、それはあなたがどんなstd::のものを使用する場合は持っているように、一般的にたくさんある、そのコンパイル単位が含まれているすべてのテンプレートのインスタンスを含む終わります発見された。

デバッガは一般に関数が宣言されている場所(デバッグ情報の一部)を知っているので、-fを "comp unit name"ではなく "宣言のファイル"として扱うオプションを追加できます。追加するには、かなりまっすぐ進むだろう

(lldb) break set -f foo.h -f foo.cpp --match-declaration-file --func-regex .* 

:次に、あなたのような何かを言うことができます。あなたがそう思っている場合は、この効果の強化要求をhttp://bugreporter.apple.comに提出してください。

void A::foo() 
{ 
    ... 
} 

は、その後、あなたが「^ {」上のソースの正規表現を行うことができます。

あなたはあなたのような関数を書くの規則に従っている場合。これがこのコーディング規則の第一の理由であり、関数の初めから取り出せるようになりました。

テンプレートのインスタンス化はほとんどStdから来ている場合は、.oのファイルを見つけて(これはOS X上である)のような何か行うことができます:非STDのリストを生成します

$ nm <file-basename>.o -s __TEXT __text -j | c++filt | grep -v std 

を関数をこの.oファイルに追加してから、各行の先頭にbreak set -nを追加して、その行を追加することができます。

関連する問題