从其他函数调用具有临时非常量QString引用的函数时,GDB崩溃

时间:2013-07-20 03:25:37

标签: c++ qt gdb

我正在尝试找到一种非慢速方法来从GDB中打印QString值。我的方法是定义一个函数(仅在GDB中使用),该函数对QString进行非const引用,将其转换为非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之外,我还有什么其他选择?

1 个答案:

答案 0 :(得分:0)

我相信gdb的bugzilla中有一个关于此问题的错误。

同时,在程序中使用gdb的漂亮打印工具而不是辅助方法通常更好。漂亮的打印机方法适用于辅助方法无法实现的许多情况:它们自动在回溯中,在“信息本地”中工作,并且如果您正在检查核心文件。

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