C++ 当从其他函数调用非常量QString引用为temporary的函数时,GDB崩溃
我试图找到一种非慢速的方法来打印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
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;
}