Nov30

【转载】Linux下动态链接库so文件覆盖导致coredump问题的分析

Author: ifreax  Click: 315   Comments: 0 Category: Linux C/C++编程  Tag: coredump,so,cp,linux

尝试解答以下问题:

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

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

 

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

 

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

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


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

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

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

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

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

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

 

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

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

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

 

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

strace install new.so old.so



install 的方式跟cp不同,先unlinkcreat,当unlink的时候,已经map的虚拟空间vma中的inode结点没有变,只有inode结点的引用计数为0是,kernel才把它干掉。

也就是新的so和旧的so用的不是同一个inode结点,所以不会相互影响。这时只有得启程序才会使用到新的so。所以采用这种方式的话就可以避免先stop进程,更新so,再重启进程这样比较耗时的操作。
Nov14

【原创】判断程序输出是否有被重定向

Author: leeon  Click: 329   Comments: 0 Category: Linux C/C++编程  Tag: isatty,linux,c,function

如果我们要拒绝用户将打印输出被重定向输出到其他地方,比如文件或者/dev/null,那么我们可以使用isatty函数来判定程序执行是否有被重定向输出。

示例代码如下:

[code="cpp"]
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char **argv){

if(!isatty(fileno(stdout))){
fprintf(stderr,"you are not a terminal! ");
exit(1);
}

/*********逻辑代码*********/

exit(0);
}
[/code]

Oct16

【原创】Galaxy S2 (GT-I9100)国行Google服务安装步骤

Author: leeon  Click: 1211   Comments: 0 Category: 生活  Tag: galaxy s2,i9100,samsung,android,google

最近入手i9100国行一步,一直是google的忠实fans,可惜这国行上google的应用全部给废了,索性研究了一通,把google的原生电子市场和google+安装上去了,写下步骤分享给i9100的机友们:

1. 首先先下载

GoogleServicesFramework.apk
GoogleContactsSyncAdapter.apk
GoogleCalendarSyncAdapter.apk

这三个服务包并安装,下载地址http://bbs.gfan.com/android-2912275-1-1.html

机器最好给越狱root。

2. 然后安装安卓市场或安致市场把google的“电子市场”应用给安装。

3.最后操作i9100:“设定”->"帐号和同步"->"添加账户" 这时会出现google的账户图标,点击添加google账户即可,然后转去电子市场应用就发现可以用了

Sep28

rsync使用小记

Author: leeon  Click: 491   Comments: 0 Category: linux  Tag: rsync

1. rsync 修改配置文件后无须重启rsyncd进程即可立即生效。

2. --delete参数在差量更行目录文件的时候切忌远端和目的端均不需要在目录后面加“*”,例如/aaa/bbb/*

分类

标签

归档

最新评论

王爷在21:32:04评论了
【原创】获取jQuery中Ajax函数的返回值的方法
Funny在10:22:51评论了
shell数组使用方法小记
kevinems在11:30:08评论了
【原创】使用gitosis和tortoisegit打造自己的git服务
candy在13:11:40评论了
【原创】beautifulsoup解析中文网页乱码解决
thenbsp.com在16:17:48评论了
中国邮政EMS就是一坨屎

我看过的书

链接

其他

访问本站种子 本站平均热度:1218 c° 本站链接数:55 个 本站标签数:250 个 本站被评论次数:33 次