2016-10-21 19 views
0

私はpythonをサポートしてgdb-7.12を構築していますが、きれいな印刷が可能で、https://sourceware.org/gdb/wiki/STLSupportに従ってgdbinitファイルを設定しました。gdbのstl関数は最適化を無効にした後でもインラインで表示されます

しかし、私は、任意のコンテナのサイズに印刷するたびに:

p ivec.size() 
Cannot evaluate function -- may be inlined 

をここでMCVEは私が別のコンパイルオプションに実際に

g++-6 -g -O0 -fno-inline-functions -gdwarf-2 Source.cpp --std=c++14 

を試してみました

#include <vector> 

using namespace std; 

int main(){ 
    vector<int> ivec; 
    return 0; 
} 

を使用していますです私は上記のオプションのすべての組み合わせを試して、常に同じ問題。

問題を修正してg ++ - 4.8に切り替えたかどうかを確認するために、gdb-7.11(ソースからビルドされています)に切り替えようとしましたが、いずれも問題を解決していないようです。

私は間違っていますか?オプションを指定しなければならない特定の順序はありますか?

EDIT: 多くの人が問題を解決するために、いくつかのマクロを示唆しているが、私の問題は何とかこれらの機能を印刷することはありませんが、私はそのために私自身かなりprintメソッドを書くことができます。

私の質問は、なぜ-O0オプションを使用して最適化を無効にした後でも、インラインで表示される機能ですか?

+0

http://stackoverflow.com/questions/22163730/cannot-evaluate-function-may-be-inlinedの重複はありますか? – UKMonkey

+1

またはこちらhttp://stackoverflow.com/questions/427589/inspecting-standard-container-stdmap-contents-with-gdb – UKMonkey

+0

@UKMonkey私はそれがそうは思わない、私はこれらの質問を見て、私は最適化を試してみましたオプションと私はベクトルのサイズを印刷するにはかなり印刷する必要はありません –

答えて

3

私の質問は、なぜ-O0オプションで最適化を無効にした後でも、インラインで表示されるのですか?

g ++は、プログラムで実際に使用されているテンプレートのみをインスタンス化し、プログラムは実際にsizeメソッドを使用しません。

あなたはnmを使用して、これをチェックすることができます。

$ nm -C q|grep size 
$ 

私はreturn ivec.size()を使用するようにプログラムを変更する場合は、私ができる:

(gdb) p ivec.size() 
$1 = 0 

インライン化および非インスタンス化してこの全体的な状況が理由ですgdb xmethodがサポートされました。そして、libstdC++にはいくつかのxmethodがあります(ただし、特にこれがあるかどうかは確認していません)。私はそれを使うことをお勧めします。

+0

まさに私が望んでいた!ありがとう。 –

関連する問題