?58 pinNodes.push_back(node); ?
?59 } ?
?60 nlb::application::Application::instance().interpreter().eval(QString("unset %1").arg(pinIterListVarName)); ?
?61 ?
?62 if (!pinNodes.empty()) { ?
?63 insert(0, pinNodes.begin(), pinNodes.end()); ?
?64 } ?
?65 } catch (const std::exception& e) { ?
B+>?66 SA_ASSERT(false, e.what()); ?
?67 } ?
?68 }
来自gdb。我已将断点设置为失败断言。当我试图使用p e.what()
打印失败的原因时,gdb打印Couldn't find method (null)what
印刷说明它是不完整的。
(gdb) p e
$4 = (const struct std::exception &) @0x58f1990: <incomplete type>
如何打印?
如果SA_ASSERT
的条件为假,它调用这个
void printTrace(unsigned int startDepth, QString& buff)
{
const size_t maxDepth = 200;
size_t stackDepth;
void *stackAddrs[maxDepth];
char **stackStrings;
stackDepth = backtrace(stackAddrs, maxDepth);
stackStrings = backtrace_symbols(stackAddrs, stackDepth);
buff += "Call stackn";
unsigned int line = 1;
for (size_t i = startDepth; i < stackDepth; i++) {
size_t sz = 500; // just a guess, template names will go much wider
char *function = reinterpret_cast<char*>(malloc(sz));
char *begin = 0, *end = 0;
// find the parentheses and address offset surrounding the mangled name
for (char *j = stackStrings[i]; *j != 0; ++j) {
if (*j == '(') {
begin = j;
} else if (*j == '+') {
end = j;
}
}
if (begin && end) {
begin++;
*end = 0;
// found our mangled name, now in [begin, end)
int status;
char *ret = abi::__cxa_demangle(begin, function, &sz, &status);
if (ret) {
// return value may be a realloc() of the input
function = ret;
} else {
// demangling failed, just pretend it's a C function
// with no args
std::strncpy(function, begin, sz);
std::strncat(function, "()", sz);
function[sz-1] = ' ';
}
buff += QString::number(line++) + QString(") ") + function + "n";
} else {
// didn't find the mangled name, just print the whole line
buff += QString::number(line++) + QString(") ") + stackStrings[i] + "n";
}
free(function);
}
free(stackStrings); // malloc()ed by backtrace_symbols
}
gdb版本
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
不完整的类型意味着您丢失了一些调试信息。没有它,gdb做不了什么。例如,它不能打印该类型的对象,因为它不知道该类型是如何布局的。
版本6.8是相当旧的。如果可以的话,你应该升级。从那时起,对c++的支持已经修复了很多很多的错误。
"(null)"看起来像是一个gdb错误。这就是当您尝试打印NULL(至少使用glibc)时会发生的情况。然而,这个错误很可能在过去5年的某个时候被修复了。