c++ - 来自垂死的多线程进程的核心转储

标签 c++ multithreading shared-libraries solaris coredump

我的多线程应用程序(C++、SunOS)与共享库动态链接。程序中有几个线程,其中一些来自库。其中一个线程调用 exit() 并导致从共享库中的另一个线程生成核心转储:

(dbx) where
  [1] 0x0(0xbeee0b30, 0x0, 0x0, 0x1c00, 0x1, 0xbeee0b50), at 0x0
  [2] STLCollectionWrapper<std::vector<SM_Timer*,std::allocator<SM_Timer*> > >::empty(0xbeee0b30, 0x0, 0x0, 0x1c00, 0xbca12200, 0x0), at 0xbee04690
  [3] GenPtrSortVec<SM_Timer,std::less<SM_Timer>,std::allocator<SM_Timer> >::isEmpty(0xbeee0b30, 0x0, 0x0, 0x0, 0x4fb0e0, 0xbd436b90), at 0xbee04424
  [4] sm_tmr_process(0x341000, 0x8e400, 0xbeeba00f, 0x1c00, 0x1, 0xbeee0800), at 0xbee03968
  [5] sm_nm_process_timeouts(0xbc67bf94, 0xbc67bf98, 0xbd4c3800, 0x0, 0xbca12200, 0xbee830f0), at 0xbee813dc
  [6] TimerThreadObject::poll(0x0, 0xbc67c000, 0x0, 0x0, 0xbedf1530, 0x1), at 0xbedf15f4
(dbx) thread
current thread ($thread) is t@null
(dbx) lwps
  l@1 LWP suspended in __SLIP.FINAL__A()
  l@3 LWP suspended in find_composition_start()
o>l@6 signal SIGSEGV in 0x0()

堆栈帧 6-4 来自 libA,帧 3-2 来自 libB。第 1 帧必须是从 C++ 标准库 (/usr/lib/libCstd.so.1?) 调用的。如您所见,此调用失败。

在第 4 帧,代码调用了 GenPtrSortVec 类型的全局对象的 isEmpty() 方法。此对象位于定义方法 sm_tmr_process() 的同一模块中的堆栈中。后来在第 2 帧,代码调用了 STL vector 对象的 empty() 方法。该 vector 是 GenPtrSortVec 类的一个字段。

关于这个问题我有以下问题:

  1. 为什么第一帧的地址是0x0?

  2. 是否有可能在取消程序中的所有线程之前从垂死的进程中卸载了 libCstd?请注意,libCstd 已作为动态依赖项自动加载到进程中。

还有两个关于退出流程的问题:

  1. 是否有可能在取消所有线程和销毁全局/静态对象之前自动卸载了自动加载的共享库?

  2. 是否有可能在取消所有线程之前全局或静态对象已被销毁?

最佳答案

1.1 - 可能是空指针调用(参见 Jörgen)

1.2 - 没有

2.1 - 没有

2.2 - 可能

1.2/2.1:程序加载到内存时加载共享库。然后动态链接器将扫描所有外部引用并修复它们。这就是动态链接的过程。这不会被撤消,即操作系统不会卸载以这种方式加载的任何库。一旦程序终止,整个过程镜像将被丢弃。

2.2 - 这取决于您的应用程序。全局/共享对象的初始化可能有问题 - 请参阅静态初始化失败。这同样适用于销毁。两种情况下的顺序都是由实现定义的。

关于c++ - 来自垂死的多线程进程的核心转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5007239/

相关文章:

C++ TCP 服务器比较字符串失败

c++ - 在 Visual C++ 中的不同文件和不同命名空间中使用函数

c++ - 我如何定义一个只绑定(bind) xvalue 或 prvalue 而不是两者的函数

c++ - Qt Table 和 Tree View 同模型

android - 异步任务 Android 中的 java.util.concurrent.RejectedExecutionException

java - 在 Swing 中没有得到预期的输出

c# - 并行不适用于 Entity Framework

ios - Xcode 库已包含但未找到?

c++ - GCC 和 ld 找不到导出的符号......但它们在那里

linux - 修改可执行文件的链接路径