程序在引发异常时挂起
Programs hangs while throwing an exception
我在共享主机上运行C++程序(web服务器)时遇到问题。
该程序在我的开发机器上运行良好,但当我尝试在主机上运行它时,它在尝试抛出异常时挂起。
它试图抛出一个异常并不是问题;如果它成功地抛出了异常,那么该异常将在几个堆栈帧之前被捕获,并且web服务器将继续运行。
这是挂线的堆栈轨迹:
#0 __lll_lock_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:136
#1 0x00007f18e559669a in _L_lock_1088 () from /home/nr/lib/glibc-2.14.1/lib/libpthread.so.0
#2 0x00007f18e55964fa in __pthread_mutex_lock (mutex=0x7f18e66b6930) at pthread_mutex_lock.c:82
#3 0x00007f18e530f3db in __dl_iterate_phdr (callback=0x970100 <_Unwind_IteratePhdrCallback>, data=0x7f18e2fe9040) at dl-iteratephdr.c:42
#4 0x00000000009714e3 in _Unwind_Find_FDE ()
#5 0x000000000096daf6 in uw_frame_state_for ()
#6 0x000000000096ed40 in uw_init_context_1 ()
#7 0x000000000096f53e in _Unwind_RaiseException ()
#8 0x00000000008dfe7b in __cxa_throw () at ../../../../gcc-5.1/libstdc++-v3/libsupc++/eh_throw.cc:82
#9 0x000000000054ff6e in Wt::WEnvironment::getCookie(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const () at /home/nr/dev/libraries/wt-3.3.4/src/Wt/WEnvironment.C:435
#10 0x000000000069a372 in Wt::WebSession::handleRequest(Wt::WebSession::Handler&) () at /home/nr/dev/libraries/wt-3.3.4/src/web/WebSession.C:1388
#11 0x000000000068a21c in Wt::WebController::handleRequest(Wt::WebRequest*) () at /home/nr/dev/libraries/wt-3.3.4/src/web/WebController.C:713
#12 0x00000000004d815b in boost::asio::detail::completion_handler<boost::_bi::bind_t<void, boost::_mfi::mf1<void, Wt::WebController, Wt::WebRequest*>, boost::_bi::list2<boost::_bi::value<Wt::WebController*>, boost::_bi::value<http::server::HTTPRequest*> > > >::do_complete(boost::asio::detail::task_io_service*, boost::asio::detail::task_io_service_operation*, boost::system::error_code const&, unsigned long) () at /home/nr/dev/dist/boost/include/boost/bind/mem_fn_template.hpp:165
#13 0x000000000056e4a2 in Wt::WIOService::run() () at /home/nr/dev/dist/boost/include/boost/asio/detail/task_io_service_operation.hpp:38
#14 0x0000000000810ff3 in thread_proxy ()
#15 0x00007f18e5593cea in start_thread (arg=0x7f18e2fec700) at pthread_create.c:301
#16 0x00007f18e52d8fcd in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:115
由于它在开发机上运行良好,我怀疑这个问题可能与开发机上存在的共享库版本不同于托管机有关,但我不知道具体是什么。我会静态地链接所有我能链接的东西,包括libstdc++,正是为了避免这样的问题。
任何关于如何进一步诊断这个问题的建议都将不胜感激。
编辑:如果有帮助,开发机器运行Debian Jessie,而主机运行CentOS 6.8。
我解决了这个问题。这确实与开发机器与主机上存在的共享库的不同版本有关。
我已经静态地链接了所有C++库,只有C库保持动态链接。值得注意的是,glibc保持动态链接,因为它不太支持静态链接。
开发机器上安装的glibc版本为2.19;在主机上,它是2.12。
当我最初试图在主机上运行程序时,我得到了一个错误的形式:
./myapp: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by ./myapp)
(之所以要求2.14而不是2.19,是因为我的程序实际使用的功能在2.14及更高版本中存在,glibc版本是向后兼容的。)
为了解决这个问题,我构建了glibc 2.14,将其二进制文件上传到主机,并使用LD_LIBRARY_PATH
将程序指向它们。这使得上面的错误消失了,但我现在明白了促使我发布这个问题的窍门。
事实证明,挂起的原因是,有一个glibc组件的路径在编译时被烘焙到可执行文件中,并且不会被LD_LIBRARY_PATH
——加载程序(ld-linux.so
)覆盖。
所以,我使用了主机的glibc 2.12加载程序,以及glibc 2.14中剩下的库,但这不起作用。
我通过更改在开发机器上生成程序的链接器命令来解决这个问题,将其硬编码为宿主机器上glibc 2.14加载程序的路径,如本答案所述(非常感谢@EmployedRussian的编写!)。
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 设置变量时C++程序挂起
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 有时ShowWindow从不调用OnShowWindow,主应用程序挂起
- 调试器在异常C++时未挂起调试对象
- JNI GetMethodID 调用,带有挂起的异常 java.lang.ClassNotFoundException
- 程序在引发异常时挂起