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,再重启进程这样比较耗时的操作。
分享到:
相关推荐
默认情况下,它的值是`core`,这意味着core dump文件将会被保存到导致core dump发生的进程的工作目录下,且文件名是`core`。如果需要自定义文件名和路径,可以通过更改此文件的内容来实现。例如,可以设置为: ```...
Core Dump 是 Linux 系统中一种特殊的文件,它记录了系统崩溃或死机时的系统状态信息。Core Dump 文件可以帮助开发者快速定位问题,解决系统崩溃的原因。 二、Core Dump 分析步骤 1. 抓取 trace:在系统崩溃后,...
在 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/...
在Windows操作系统上,生成Coredump文件对于调试和分析C++程序崩溃原因至关重要。Coredump文件包含了程序崩溃时内存中的关键信息,如进程的内存映射、全局变量、堆栈信息等,使得开发者能够定位到问题的具体位置,...
Linux Core Dump 权威书籍
本资料"coredump问题原理探究-Linux x86版"聚焦于Linux环境下,特别是x86架构下的核心转储文件分析,旨在帮助开发者深入理解core dump的工作机制,并提供有效的定位和解决问题的方法。 一、core dump的基本概念 1. ...
Core Dump 文件的产生是由于进程收到某个信号的时候,Linux 上现在大概有 60 多个信号,可以使用 kill -l 命令全部列出来。常见的信号包括 SIGSEGV、SIGILL、SIGFPE、SIGBUS 等。这些信号通常是由于数组越界、空指针...
#### 一、Linux 下 Core Dump 文件 **Core Dump 文件** 是一种在程序崩溃时由操作系统自动生成的文件,它包含了程序崩溃时刻的内存快照以及相关的系统信息。这对于后续的调试非常有用,可以帮助开发者定位问题所在...
如果开发板上不支持 GDB,可以将开发板的环境(头文件、库)、可执行文件和 Core 文件拷贝到 PC 的 Linux 下,运行相关命令即可。注意:待调试的可执行文件,在编译的时候需要加 `-g`,Core 文件才能正常显示出错...
5. **共享库信息**:列出程序使用的动态链接库及其状态,对于理解依赖关系和符号解析至关重要。 高通的core dump解析工具可能提供了以下功能: 1. **符号解析**:将内存地址转换为源代码行,使得开发者能直观地...
### Linux下产生Core Dump文件及使用GDB调试详解 #### 一、Core文件的基本概念与作用 当一个程序因为某些原因而崩溃时,系统内核会自动创建一个名为`core`的文件,这个文件包含了程序崩溃时刻的内存映像以及其他...
在Linux系统中,当应用程序遇到不可恢复的错误时,如段错误(Segmentation fault),系统会生成一个核心转储文件(core dump)。这个文件包含了进程崩溃时刻的内存映像、寄存器状态以及堆栈信息,是分析和调试程序...
总结起来,正确配置Linux下MySQL数据库的coredump涉及三个主要方面:确保coredump目录的可写性,处理seteuid()和setegid()导致的权限问题,以及设置合适的core文件大小限制。这些步骤有助于在MySQL出现问题时,获取...
标题《Coredump简介及使用》和描述《Android Coredump简介及使用_v1.0_***.pdf》揭示了文档主要介绍Coredump的基本概念、产生的原因、控制产生Coredump的方法以及如何使用Coredump文件。Coredump机制广泛存在于多个...
当一个运行在Linux上的应用程序因为某种原因异常终止(如段错误、除零错误等)时,操作系统可以被配置为生成一个`coredump`文件。这个文件包含了程序崩溃时的内存映像、寄存器状态以及其他相关信息,使得开发者能够...
如何在让docker中运行的进程生成core dump文件
在Linux系统中,调试是解决程序异常和错误的关键步骤,特别是在遇到程序崩溃并产生coredump时。coredump是操作系统在程序异常终止时保存的内存映像,包含了程序运行时的状态,如内存布局、堆栈信息、全局变量和...
在Linux环境中,当程序由于某种错误(如除零错误、空指针引用等)导致崩溃时,系统可以被配置为生成`coredump`文件。这个文件包含了程序运行时的内存状态,包括变量值、调用栈信息等,是调试程序的关键工具。 描述...
Linux 系统调用 Core Dump 漏洞攻击防御策略 Linux 操作系统是当今最流行的操作系统之一,然而,Linux 系统调用 Core Dump 漏洞攻击的出现却给系统安全带来了巨大的威胁。 Core Dump 漏洞是 Linux 内核 2.6.15-...