web-dev-qa-db-ja.com

最適化なしのプログラムでgdbを使用してデバッグするが、現在のコンテキストにローカル変数のシンボルがない

私はしばらくの間この問題を抱えていますが、何か間違っているように見えるため、常にこの質問をするのを先延ばしにしているようです...

#include <string>
#include <iostream>
#include <algorithm>
int main(int argc, char** argv)
{
  if(argc < 2)
  {
    std::cout << "usage: " << argv[0] << " <string>" << std::endl;
    return 1;
  }
  std::string str = argv[1];
  std::reverse(str.begin(), str.end());
  std::cout << str << std::endl;
  return 0;
}

次のコマンドでコンパイルします。

g++ -std=c++11 -Wall main.cpp -o main -O0 -ggdb3

私はgccの最新のトランクバージョンを使用しています。トランクは9月23日頃に撮影されました...また、最適化を使用してコンパイルしていないことに注意してください。

とにかく、次のようにデバッグを開始します。

gdb --quiet --args ./main string

12行目にブレークポイントを設定しました(逆アルゴリズム)

b 12

次に、プログラムを実行します

run

次に、文字列を印刷して、それが何であるかを確認します

print str

そして、これは、私の親愛なる友人たちにとって、私にとって奇妙に思われるものです。その前のコマンドの出力は次のとおりです。

No symbol "str" in current context.

ローカル変数を簡単にチェックしても文字列は表示されません

info locals

私が得るすべては

std::__ioinit = {static _S_refcount = 2, static _S_synced_with_stdio = true}

だから私は不思議に思っていますか、それとも私に問題があるのでしょうか、それともコンパイラやデバッガに問題があるのでしょう...これは長い間、お尻の問題でかなり苦痛でした...この質問を読んでくれてありがとうございます。 。:)

編集:私のgccビルドに何か問題があることが判明したので、誰かがバグレポートやこれに似た問題があると思われる他のケースに遭遇したのではないかと思っています...私はまた、最近のビルドのgdbをチェックして、現在のデバッガー(ubuntuに付属)に問題がないことを確認してください...意味がありますか?

EDIT2:したがって、gdb v7.5をコンパイルした後、ローカルがまったく存在しないことを除いて、私は比較的同じ結果を得ました...私はそれがgccの問題であることを意味します、みんなに感謝します...

33
user451498

いいえ、-quietを使用しても機能します。設定に問題がある可能性があります。

~/tmp $ g++ -Wall tmp.cpp -o tmp -O0 -ggdb3
~/tmp $ gdb --quiet --args ./tmp string
Reading symbols from /xxxxxxxx/tmp...done.
(gdb) b 12
Breakpoint 1 at 0x400c95: file tmp.cpp, line 12.
(gdb) run
Starting program: /xxxxxxxx/tmp string
Breakpoint 1, main (argc=2, argv=0x7fffffffdc58) at tmp.cpp:12
12        std::reverse(str.begin(), str.end());
(gdb) print str
$1 = "string"
(gdb) info locals
str = "string"
(gdb)
5
CrazyCasta

GCC 4.8 のリリースノート(つまり、現在のトランク)に記載されているとおり:

DWARF4は、DWARFデバッグ情報を生成するときのデフォルトになりました。 DWARFデバッグ情報を使用するプラットフォームで-gを使用すると、GCCはデフォルトで-gdwarf-4 -fno-debug-types-sectionになります。 GDB 7.5、Valgrind 3.8.0およびelfutils 0.154デバッグ情報コンシューマーは、デフォルトでDWARF4をサポートします。 GCC 4.8より前のバージョンでは、デフォルトのバージョンはDWARF2でした。 GCC 4.8で古いDWARFバージョンを生成するには、-gを-gdwarf-2または-gdwarf-3と一緒に使用します。 DarwinおよびVxWorksのデフォルトは引き続き-gdwarf-2 -gstrict-dwarfです。

したがって、GDB 7.5を使用するか、-g -gdwarf-2でコンパイルする必要があります

84
Jonathan Wakely