`

Linux下动态链接库so文件覆盖导致coredump

阅读更多
     1.为什么cp的方式更新运行中进程的so,程序会coredump

      2.采用什么方式更新已经加载了的so,就可以避免coredump



我们的公共组件绝大部分都支持so形式的自定义插件,比如s++,qzhttp,ttc。在不停进程更新so的时候往往会产生coredump,并且肯定core得莫名其妙,core得让人心碎。



先看一下用cp的方式更新so的时候发生了什么事情

strace cp new.so old.so #strace是人间利器



发现老的so被trunc了,这个过程发生的具体的事情是:

      1.应用程序通过dlopen打开so的时候,kernel通过mmap把so加载到进程地址空间,对应于vma里的几个page.

      2.在这个过程中loader会把so里面引用的外部符号例如malloc printf等解析成真正的虚存地址。

      3.当so被cp覆盖时,确切地说是被trunc时,kernel会把so文件在虚拟内的页purge 掉。

      4.当运行到so里面的代码时,因为物理内存中不再有实际的数据(仅存在于虚存空间内),会产生一次缺页中断。

      5.Kernel从so文件中copy一份到内存中去,a)但是这时的全局符号表并没有经过解析,当调用到时就产生segment fault ,  b)如果需要的文件偏移大于新的so的地址范围,就会产生bus error.



所以,如果用相同的so去覆盖

      A) 如果so 里面依赖了外部符号,coredump

      B) 如果so里面没有依赖外部符号,运气不错,不会coredump



所有问题的产生都是因为so被trunc了一把,所以如果不用turnc的方式就避免这个问题。Ok,该我们的install 上场了。

strace install new.so old.so




install 的方式跟cp不同,先unlink再creat,当unlink的时候,已经map的虚拟空间vma中的inode结点没有变,只有inode结点的引用计数为0是,kernel才把它干掉。
也就是新的so和旧的so用的不是同一个inode结点,所以不会相互影响。这时只有得启程序才会使用到新的so。所以采用这种方式的话就可以避免先stop进程,更新so,再重启进程这样比较耗时的操作。
分享到:
评论

相关推荐

    Linux下生成core dump

    默认情况下,它的值是`core`,这意味着core dump文件将会被保存到导致core dump发生的进程的工作目录下,且文件名是`core`。如果需要自定义文件名和路径,可以通过更改此文件的内容来实现。例如,可以设置为: ```...

    linux coredump分析方法实例介绍

    Core Dump 是 Linux 系统中一种特殊的文件,它记录了系统崩溃或死机时的系统状态信息。Core Dump 文件可以帮助开发者快速定位问题,解决系统崩溃的原因。 二、Core Dump 分析步骤 1. 抓取 trace:在系统崩溃后,...

    coredump文件的生成与解析.docx

    在 gdb 中,需要设置该库文件所对应的环境变量,例如: ``` set solib-absolute-prefix /opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/arm-fsl-linux-gnueabi/multi-libs/...

    window COREdump文件生成 c++代码

    在Windows操作系统上,生成Coredump文件对于调试和分析C++程序崩溃原因至关重要。Coredump文件包含了程序崩溃时内存中的关键信息,如进程的内存映射、全局变量、堆栈信息等,使得开发者能够定位到问题的具体位置,...

    coredump文件调试

    Core Dump 文件的产生是由于进程收到某个信号的时候,Linux 上现在大概有 60 多个信号,可以使用 kill -l 命令全部列出来。常见的信号包括 SIGSEGV、SIGILL、SIGFPE、SIGBUS 等。这些信号通常是由于数组越界、空指针...

    Accelerated Linux Core Dump Analysis

    Linux Core Dump 权威书籍

    coredump问题原理探究-Linux x86版.rar

    本资料"coredump问题原理探究-Linux x86版"聚焦于Linux环境下,特别是x86架构下的核心转储文件分析,旨在帮助开发者深入理解core dump的工作机制,并提供有效的定位和解决问题的方法。 一、core dump的基本概念 1. ...

    ubuntu-linux下程序崩溃生成coredump的方法.pdf

    #### 一、Linux 下 Core Dump 文件 **Core Dump 文件** 是一种在程序崩溃时由操作系统自动生成的文件,它包含了程序崩溃时刻的内存快照以及相关的系统信息。这对于后续的调试非常有用,可以帮助开发者定位问题所在...

    linux core dump

    如果开发板上不支持 GDB,可以将开发板的环境(头文件、库)、可执行文件和 Core 文件拷贝到 PC 的 Linux 下,运行相关命令即可。注意:待调试的可执行文件,在编译的时候需要加 `-g`,Core 文件才能正常显示出错...

    Linux下怎么产生core dump文件及GDB怎么调试core.pptx

    ### Linux下产生Core Dump文件及使用GDB调试详解 #### 一、Core文件的基本概念与作用 当一个程序因为某些原因而崩溃时,系统内核会自动创建一个名为`core`的文件,这个文件包含了程序崩溃时刻的内存映像以及其他...

    Linux应用程序调试之debug_coredump

    在Linux系统中,当应用程序遇到不可恢复的错误时,如段错误(Segmentation fault),系统会生成一个核心转储文件(core dump)。这个文件包含了进程崩溃时刻的内存映像、寄存器状态以及堆栈信息,是分析和调试程序...

    Linux下MySQL数据库使用coredump注意事项

    总结起来,正确配置Linux下MySQL数据库的coredump涉及三个主要方面:确保coredump目录的可写性,处理seteuid()和setegid()导致的权限问题,以及设置合适的core文件大小限制。这些步骤有助于在MySQL出现问题时,获取...

    Coredump简介及使用

    标题《Coredump简介及使用》和描述《Android Coredump简介及使用_v1.0_***.pdf》揭示了文档主要介绍Coredump的基本概念、产生的原因、控制产生Coredump的方法以及如何使用Coredump文件。Coredump机制广泛存在于多个...

    高通core dump解析工具

    5. **共享库信息**:列出程序使用的动态链接库及其状态,对于理解依赖关系和符号解析至关重要。 高通的core dump解析工具可能提供了以下功能: 1. **符号解析**:将内存地址转换为源代码行,使得开发者能直观地...

    Linux Debugging: coredump 分析入门的材料

    当一个运行在Linux上的应用程序因为某种原因异常终止(如段错误、除零错误等)时,操作系统可以被配置为生成一个`coredump`文件。这个文件包含了程序崩溃时的内存映像、寄存器状态以及其他相关信息,使得开发者能够...

    容器中生成coredump文件

    如何在让docker中运行的进程生成core dump文件

    Linux Debugging(五): coredump 分析入門1

    在Linux系统中,调试是解决程序异常和错误的关键步骤,特别是在遇到程序崩溃并产生coredump时。coredump是操作系统在程序异常终止时保存的内存映像,包含了程序运行时的状态,如内存布局、堆栈信息、全局变量和...

    Linux Debugging: coredump 分析的材料

    在Linux环境中,当程序由于某种错误(如除零错误、空指针引用等)导致崩溃时,系统可以被配置为生成`coredump`文件。这个文件包含了程序运行时的内存状态,包括变量值、调用栈信息等,是调试程序的关键工具。 描述...

    劫持Linux系统调用封杀Core Dump漏洞攻击.pdf

    Linux 系统调用 Core Dump 漏洞攻击防御策略 Linux 操作系统是当今最流行的操作系统之一,然而,Linux 系统调用 Core Dump 漏洞攻击的出现却给系统安全带来了巨大的威胁。 Core Dump 漏洞是 Linux 内核 2.6.15-...

Global site tag (gtag.js) - Google Analytics