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 之外,我还有什么选择?