?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
打印 e 给出的是不完整的。
(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 stack\n";
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".