以下を含めてコンパイルされた共有ライブラリがあります-g -O0
:
void MyClass::whatever()
{
...
doSomething(myImage, myPoints);
...
}
bool MyClass::doSomething(const Image& image, std::vector<cv::Vec2f>& points) const
{
const int32_t foo = 1;
const float bar = 0.1f;
...
}
whatever()
現在、をステップ実行していますs
が、 にステップインするのではなくdoSomething()
、 をステップスルーします。これはソースの可用性の問題ではありません。(1) は同じファイルにあり、(2) にブレークポイントを設定してdoSomething()
、問題なくソースをステップ実行できるためです。しかし、 はs
利用可能なソースがないと考えているようです。
とするとset step-mode on
、次のような出力が得られる。
0xb5d51148 in myClass::doSomething (this=0xb25e4, image=...,
points=std::vector of length -91315, capacity 372871920 = {...})
from /path/to/myclass.so
利用できるソースがない場合に取得するのと同じです。初期化が数回行われた後、n
ソースが表示されます。そのため、関数の先頭に置かれたパラメーター (タイプ、リリース ビルド) に何らかの魔法foo
がある可能性があります。これを見て、「変だ、この関数の後を続けよう」と考え、関数のほとんどに実際に利用できるソースがあることに気付かない可能性はありますか?inline
opencv
gdb
(問題になるかどうかはわかりませんが、Ubuntu を搭載した ARM ボックスで LLVM/clang 3.5 を使用してコンパイルされています)
答え1
これはおそらくgccの最適化とそれに続く行番号表によって作成されたドワーフ マップ
プログラムの実行可能コードと、そのアドレスに対応するソース行を含むメモリアドレス
(8ページ)
最も簡単な解決策は、ステップ関数に到達すると
からGDB ユーザーマニュアル(65ページ)
ステップ
制御が別のソース行に到達するまでプログラムの実行を継続し、その後停止して制御を gdb に戻します。
....
step コマンドは、ソース ラインの最初の命令でのみ停止します。これにより、switch ステートメントや for ループなどで発生する可能性のある複数の停止を防止します。step は、行内でデバッグ情報を持つ関数が呼び出されると停止を続けます。つまり、step は、行内で呼び出されるすべての関数内をステップ実行します。
また、step コマンドは、関数の行番号情報がある場合にのみ関数に入ります。それ以外の場合は、next コマンドのように動作します。これにより、MIPS マシンで cc -gl を使用するときに問題が回避されます。以前は、ルーチンに関するデバッグ情報がある場合、step はサブルーチンに入りました。