3

QString我正在尝试找到一种从 GDB中打印值的非慢速方法。我的方法是定义一个函数(仅在 GDB 中使用),它接受对 a 的非常量引用QString,将其转换为非 Unicode 字符串,并将结果发送到标准输出。但是以我希望使用它的方式使用它会导致崩溃,如下所述。

假设我定义了以下函数:

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 中运行上述程序,并且位于“您在 GDB 中”所指示的行上。

现在,在 GDB 中,您想在调用 crunchOnIt 函数fileInfo.symLinkTarget() 之前检查 的返回值。当我尝试显而易见的事情时,我得到了看起来像是崩溃的东西:

(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++ 程序只是为了添加临时文件是对开发时间的重大浪费。

这是一个 GDB 错误,它没有跟踪由fileInfo.symLinkTarget()需要提供给printQString函数的表达式创建的临时变量吗?

tmp除了插入上面的 -orary 之外,我还有什么选择?

4

1 回答 1

0

我相信在 gdb 的 bugzilla 中有一个关于这个问题的 bug。

同时,通常最好在程序中使用 gdb 的漂亮打印工具而不是辅助方法。漂亮的打印机方法在许多情况下都有效,而辅助方法则不能:它们会自动在回溯、“信息本地”中以及您正在检查核心文件时工作。

Pretty-printers 是用 Python 编写的。它们通常很容易编写。可能已经在某处为 QString 编写了打印机......啊哈: http: //nikosams.blogspot.com/2009/10/gdb-qt-pretty-printers.html

于 2013-07-26T14:32:08.600 回答