【问题标题】:Terminate with bad_alloc exception, but no "new" in stack trace以 bad_alloc 异常终止,但堆栈跟踪中没有“新”
【发布时间】:2011-08-24 18:10:09
【问题描述】:

C++ 程序抛出这个:

在抛出 'St9bad_alloc' what() 的实例后调用终止:std::bad_alloc

它似乎是从 new 抛出的,但堆栈跟踪没有显示对 new 的任何调用:

#0  0x0000003174a330c5 in raise () from /lib64/libc.so.6
#1  0x0000003174a34a76 in abort () from /lib64/libc.so.6
#2  0x00007f93b1b7b0b4 in __gnu_cxx::__verbose_terminate_handler ()
at ../../../../gcc-4.3.4/libstdc++-v3/libsupc++/vterminate.cc:98
#3  0x00007f93b1b794f6 in __cxxabiv1::__terminate (handler=0x522b)
at ../../../../gcc-4.3.4/libstdc++-v3/libsupc++/eh_terminate.cc:43
#4  0x00007f93b1b79523 in std::terminate ()
at ../../../../gcc-4.3.4/libstdc++-v3/libsupc++/eh_terminate.cc:53
#5  0x00007f93b1b79536 in __cxxabiv1::__unexpected (handler=0x522b)
at ../../../../gcc-4.3.4/libstdc++-v3/libsupc++/eh_terminate.cc:59
#6  0x00007f93b1b78ec8 in __cxxabiv1::__cxa_call_unexpected (exc_obj_in=0x7f93b1dae770)
at ../../../../gcc-4.3.4/libstdc++-v3/libsupc++/eh_personality.cc:750
#7  0x00007f93b2c356e0 in network::HttpLoader::doLoad (this=0x7f938801ef20) at loaders/HttpLoader.cxx:1071
#8  0x00007f93b2c70971 in network::Loader::load (this=0x522b) at Loader.cxx:899
#9  0x00007f93b2c74a15 in network::Loader::load2 (this=0x522b) at Loader.cxx:925
#10 0x00007f93b2c7b13a in network::LoaderThread::run() ()
#11 0x00007f93b1e60be4 in threads::Thread_startWorker (thr=0x7f938801e460) at Threads.cxx:479
#12 0x00007f93b1e60ead in threads::ThreadPool::run (this=0x1140478, thr=0x7f938801eeb0) at Threads.cxx:727
#13 0x00007f93b1e608e8 in threads::__Thread_startWorker (param=<value optimized out>) at Threads.cxx:520
#14 0x0000003175206ccb in start_thread () from /lib64/libpthread.so.0
#15 0x0000003174ae0c2d in clone () from /lib64/libc.so.6

在 doLoad() 的开头添加了调试语句,但它永远不会到达那个点。

难倒!

有什么想法吗?

【问题讨论】:

  • 你能发布一些你的代码吗?
  • 你看过loaders/HttpLoader.cxx:1071吗?
  • 1070 Document* HttpLoader::doLoad() 1071 throw (Exception&amp;) 指向投掷线,它似乎永远不会进入doLoad函数

标签: c++ linux exception


【解决方案1】:

new 调用可能不在堆栈中,因为它在您的应用程序终止时已经展开。我会尝试在抛出异常时设置断点(例如,在 gdb 下使用catch throw)——此时您将在堆栈中看到异常的原因。

【讨论】:

  • 应该在上面加上这个,在GDB中运行时不会抛出异常,只在release build中。
  • @Vireche:您可以在 gdb 中运行发布构建,构建的类型以及是否在 gdb 中运行它是无关的。还是您的意思是它仅在不在 gdb 中运行时才会发生?
  • 是的,它只在不在 GDB 中运行时才会发生,并且只有发布版本会显示此问题。
  • 感谢大家的帮助。事实证明,新的 IT 人员为内存的 ulimit 设置了一个非常低的值(对于我的帐户)。所以显然它确实内存不足。
【解决方案2】:

new 调用可能由于优化而被内联。尝试禁用优化,至少在 loaders/HttpLoader.cxx 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 2012-07-11
    • 2011-01-05
    • 1970-01-01
    • 2017-08-06
    • 2010-09-13
    • 2011-10-21
    相关资源
    最近更新 更多