33

私はしばらくの間この問題を抱えていましたが、何か間違ったことをしているように見えるので、この質問をするのをいつも延期しているようです...しかし今はそうではないと感じています...このコードを取りました:

#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の問題だと思います、みんなありがとう...

4

2 に答える 2

87

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

DWARF デバッグ情報を生成するとき、DWARF4 がデフォルトになりました。-g が DWARF デバッグ情報を使用するプラットフォームで使用されると、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

于 2013-02-24T11:02:49.660 に答える
5

いいえ、 --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)
于 2012-09-26T06:29:53.637 に答える