Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当从其他函数调用非常量QString引用为temporary的函数时,GDB崩溃_C++_Qt_Gdb - Fatal编程技术网

C++ 当从其他函数调用非常量QString引用为temporary的函数时,GDB崩溃

C++ 当从其他函数调用非常量QString引用为temporary的函数时,GDB崩溃,c++,qt,gdb,C++,Qt,Gdb,我试图找到一种非慢速的方法来打印GDB中的QString值。我的方法是定义一个函数(仅在GDB中使用),该函数接受对QString的非常量引用,将其转换为非Unicode字符串,并将结果发送到标准输出。但以我希望的方式使用它会导致崩溃,如下所述 假设我定义了以下函数: void printQString(const QString & in) { // The other option is to use GDB trickery as indicated by http://tin

我试图找到一种非慢速的方法来打印GDB中的
QString
值。我的方法是定义一个函数(仅在GDB中使用),该函数接受对
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进入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;
}
void someFunc()
{
QFileInfo文件信息(“/tmp/flubberbonesbest”);
fileInfo.makeAbsolute();
if(fileInfo.isSymLink()){

QString tmp=fileInfo.symLinkTarget();//我相信gdb的bugzilla中有一个关于这个问题的bug

同时,一般来说,在程序中使用gdb的漂亮打印工具比使用助手方法要好。漂亮打印方法在许多助手方法无法做到的情况下都能工作:它们自动在回溯、在“信息局部”中工作,并且如果您正在检查核心文件


漂亮的打印机是用Python编写的。它们通常编写起来非常简单。可能已经有为QString编写的打印机……啊哈:

GDB不能很好地处理临时程序。它使用自己的内存来存储它们,而不是目标程序内存。因此,临时程序不能通过引用传递给函数,因为e无法获取其地址(对象位于完全不同的地址空间中)。我的GDB版本没有崩溃,它说“尝试获取不在内存中的值的地址”,尽管有一个更简单的示例,不涉及Qt。当尝试使用类似
&(5)的东西时,它说了同样的话
。这是GDB的一个限制。我恐怕在这里做不了什么。@n.m:这对我来说是有意义的,这就是我担心的。你能通过将函数改为接受
QString
而不是
const QString&
?来解决这个问题吗?只是一个猜测。@sashoalm:我试着按你说的方式传递值,它也可以灰烬。问题是临时地址在不同的地址空间。我想我现在只能接受这个了。
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;
}