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

我的多线程应用程序(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来自libB,来自libB的帧3-2。 帧1必须从C ++标准库(/usr/lib/libCstd.so.1?)调用。 如您所见,此通话失败。

在第4帧,代码称为GenPtrSortVec类型的全局对象的isEmpty()方法。 该对象位于定义方法sm_tmr_process()的同一模块的堆栈中。 稍后在第2帧,代码称为STL矢量对象的empty()方法。 该向量是GenPtrSortVec类的字段。

我对这个问题有以下问题:

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

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

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

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

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


  • 1.1 - 可能是一个空指针调用(请参阅Jörgen)

    1.2 - 不

    2.1 - 没有

    2.2 - 可能

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

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


    回答1:您可能调用了NULL函数指针。 可能不是直接的,而是间接的。 你能用零覆盖一个对象的vtable,然后调用它的虚拟方法吗?

    链接地址: http://www.djcxy.com/p/60523.html

    上一篇: core dump from dying multithreaded process

    下一篇: Should I use != or <> for not equal in T