3

QStringGDB内から値を出力するための遅くない方法を見つけようとしています。QString私のアプローチは、への非 const 参照を取り、それを非 Unicode 文字列に変換し、結果を標準出力に送信する関数 (GDB 内からのみ使用される) を定義することです。しかし、私が望む方法でそれを使用すると、以下で説明するようにクラッシュが発生します。

次の関数が定義されているとします。

void printQString(const QString & in)
{
  // The other option is to use GDB trickery as indicated by http://tinyurl.com/k6mfgxy but that is DOG SLOW:
  printf("%s\n",in.toLocal8Bit().data()); fflush(stdout);
}

void crunchOnIt(const QString & in)
{
   // ... Do something useful with "in" here ...
}

void someFunc()
{
  QFileInfo fileInfo("/tmp/flubberBouncesBest");
  fileInfo.makeAbsolute();
  if (fileInfo.isSymLink()) {
    crunchOnIt(fileInfo.symLinkTarget()); // <-- You are right here in GDB.
    return true;
  }
  return false;
}

上記を GDB 内から実行し、「You are right here in GDB」で示される行にいるとします。

ここで、crunchOnIt 関数を呼び出すfileInfo.symLinkTarget() 前に、GDB 内から の戻り値を調べます。明らかなことを試してみると、クラッシュのように見えるものが得られます。

(gdb) call printQString(fileInfo.symLinkTarget())

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff059ba4b in gconv () from /usr/lib64/gconv/UTF-16.so
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on".
Evaluation of the expression containing the function
(printQString(QString const&)) will be abandoned.
When the function is done executing, GDB will silently stop.

ただし、GDB が crunchOnIt にステップインし、"in" パラメーターを指定して printQstring を呼び出すと、問題なく動作します。

プログラムを編集して一時的なものを追加する必要があります。たとえば、次のようになります。

void someFunc()
{
  QFileInfo fileInfo("/tmp/flubberBouncesBest");
  fileInfo.makeAbsolute();
  if (fileInfo.isSymLink()) {
    QString tmp = fileInfo.symLinkTarget(); // <-- No I don't want to have to recompile the program to insert this temporary!
    crunchOnIt(tmp);
    return true;
  }
  return false;
}

printQstring一時変数を追加するためだけに大規模な C++ プログラムを再コンパイルすると、開発時間が大幅に無駄になるため、再コンパイルは関数の目的を無効にします。

これは、関数fileInfo.symLinkTarget()に供給する必要がある式によって作成された一時を追跡していない GDB のバグですか?printQString

tmp上記の -oraryを挿入する以外に、どのような選択肢がありますか?

4

1 に答える 1

0

この問題について、gdb の bugzilla に未解決のバグがあると思います。

一方、一般的には、プログラムでヘルパー メソッドを使用するよりも、gdb の整形出力機能を使用する方が適切です。pretty-printer アプローチは、ヘルパー メソッドができない多くの状況で機能します。それらは、バックトレース、「情報ローカル」、およびコア ファイルを調べている場合に自動的に機能します。

Pretty-printers は Python で書かれています。それらは通常、非常に簡単に記述できます。おそらくどこかにQString用に書かれたプリンターがすでにあるでしょう...あは:http://nikosams.blogspot.com/2009/10/gdb-qt-pretty-printers.html

于 2013-07-26T14:32:08.600 に答える