title: gdb error: Couldn't find method (null)what
body: <pre><code>  ?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&amp; e) {                                                                                                                          ?
  B+&gt;?66              SA_ASSERT(false, e.what());                                                                                                                              ?
     ?67          }                                                                                                                                                            ?
     ?68      }           
  </code></pre>
  
  <p>This is from gdb. I have set breakpoint to failing assert. When I am trying to print the reason of failure using <code>p e.what()</code> gdb prints <code>Couldn't find method (null)what
  </code></p>
  
  <p>Printing e gives that is is incomplete.</p>
  
  <pre><code>(gdb) p e
  $4 = (const struct std::exception &amp;) @0x58f1990: &lt;incomplete type&gt;
  </code></pre>
  
  <p>How I can print it?</p>
  
  <p>If <code>SA_ASSERT</code>'s condition is false it calls this </p>
  
  <pre><code>void printTrace(unsigned int startDepth, QString&amp; 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 &lt; stackDepth; i++) {
          size_t sz = 500; // just a guess, template names will go much wider
          char *function = reinterpret_cast&lt;char*&gt;(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 &amp;&amp; end) {
              begin++;
              *end = 0;
              // found our mangled name, now in [begin, end)
              int status;
              char *ret = abi::__cxa_demangle(begin, function, &amp;sz, &amp;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
  
  }
  </code></pre>
  
  <p>The gdb version</p>
  
  <pre><code>GNU gdb 6.8
  Copyright (C) 2008 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;
  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".
  </code></pre>