Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

signal 7 (SIGBUS), code 2 (BUS_ADRERR) #204

Closed
buptlingfeng opened this issue Apr 12, 2017 · 35 comments
Closed

signal 7 (SIGBUS), code 2 (BUS_ADRERR) #204

buptlingfeng opened this issue Apr 12, 2017 · 35 comments

Comments

@buptlingfeng
Copy link

线上测试的时候发现 void LogBuffer::Flush(AutoBuffer& _buff) 调用 void LogBuffer::Clear()的时候出现上述的错误,具体抛错的地方是在执行memset(buff.Ptr(), 0, buff.MaxLength());的时候出现的

@garryyan
Copy link
Collaborator

什么机型 什么操作系统,是否必现

@buptlingfeng
Copy link
Author

有4.4.2 5.0 5.1.1 6.0 6.0.1 不是必现的问题 机型有小米 OPPO 酷派等

@FelixZhang00
Copy link

FelixZhang00 commented May 5, 2017

同样遇到了这个错误

Hardware: DYOS;Android 4.4.4,level 19
Retrace CallStack: 
SIGBUS(BUS_ADRERR): 
#00  pc 00022098  /system/lib/libc.so (__memcpy_base+180) [armeabi-v7a::2a574c1625dbbc6f3e56834c39beb987]
#01  pc 00004c04  /system/lib/libz.so (deflate+924) [armeabi-v7a::ecfc2652064aa667f591648ee13f2439]
#02  pc 0000a5fd  /data/app-lib/com.ktcp.video-2/libmarsxlog.so (_ZN9LogBuffer5WriteEPKvj+116) [armeabi-v5te::2ce0551e6f27dd8d4c02f902104d3ecf]
#03  pc 0000789d  /data/app-lib/com.ktcp.video-2/libmarsxlog.so [armeabi-v5te::2ce0551e6f27dd8d4c02f902104d3ecf]
#04  pc 00009227  /data/app-lib/com.ktcp.video-2/libmarsxlog.so [armeabi-v5te::2ce0551e6f27dd8d4c02f902104d3ecf]
#05  pc 0000a81f  /data/app-lib/com.ktcp.video-2/libmarsxlog.so (__xlogger_Write_impl+114) [armeabi-v5te::2ce0551e6f27dd8d4c02f902104d3ecf]
#06  pc 0000a959  /data/app-lib/com.ktcp.video-2/libmarsxlog.so (xlogger_Write+12) [armeabi-v5te::2ce0551e6f27dd8d4c02f902104d3ecf]
#07  pc 00006025  /data/app-lib/com.ktcp.video-2/libmarsxlog.so (Java_com_tencent_mars_xlog_Xlog_logWrite2+232) [armeabi-v5te::2ce0551e6f27dd8d4c02f902104d3ecf]
#08  pc 0001db4c  /system/lib/libdvm.so (dvmPlatformInvoke+112) [armeabi-v7a::35e0596edeee9b663f5f38f56c6af84e]

知道是什么原因吗?

@garryyan
Copy link
Collaborator

garryyan commented May 5, 2017

@FelixZhang00 @buptlingfeng 已经在灰度验证了,因为我这边没看到这个类型的crash,麻烦 @buptlingfeng 有进度同步一下

@buptlingfeng
Copy link
Author

buptlingfeng commented May 5, 2017 via email

@buptlingfeng
Copy link
Author

buptlingfeng commented May 5, 2017 via email

@FelixZhang00
Copy link

是线上测试的,本地没有出现过。

@FelixZhang00
Copy link

我只修改了写日志的策略,用多个文件回滚记录。

@garryyan
Copy link
Collaborator

garryyan commented May 5, 2017

@FelixZhang00 改了xlog的代码?

@FelixZhang00
Copy link

改了appender.cc的部分代码,和LogBuffer的__Clear方法:

void LogBuffer::__Clear() {
    //memset(buff_.Ptr(), 0, buff_.MaxLength());
    buff_.Length(0, 0);
}

@FelixZhang00
Copy link

有没有可能这里__appender_async在栈上分配了较大的内存导致的?

@buptlingfeng
Copy link
Author

buptlingfeng commented May 5, 2017 via email

@FelixZhang00
Copy link

有没有可能是同时有太多线程调用__appender_sync方法导致的?我这边先模拟试一下

@buptlingfeng
Copy link
Author

buptlingfeng commented May 5, 2017 via email

@FelixZhang00
Copy link

@garryyan 这个跟ndk的版本有关吗?编译xlog需要哪个ndk版本?

@garryyan
Copy link
Collaborator

garryyan commented May 8, 2017

@FelixZhang00 应该没什么关系, 我们一般用r11c

@buptlingfeng
Copy link
Author

buptlingfeng commented May 8, 2017 via email

@FelixZhang00
Copy link

BUS_ADRERR在这篇文章的解释是:

Another reason where SIGBUS can generate is explained below:
You are currently using a external I/O device by mapping the device memory
mapping into the system memory (Memory mapped I/O). You have used it. And
now, you have disconnected it gracefully. But, somehow your code is trying
to use an previouslt used address still in your code. The result in this
case will be an SIGBUS, the reason is BUS_ADRERR, "non-existent physical
address".

产生这个问题的原因可能是mmap文件被删掉了吗?
但是我把log.mmap2删掉,发现日志还是能正常写到log文件里。
然后我查看了进程的maps,发现mmap2文件被标记位deleted,这个原因我不是很清楚,希望能解释下☺

是不是说我通过shell删除log.mmap2,但是系统发现还有进程在读写它,就把它标记为deleted,其实文件还是存在的,
等进程结束再真正把这个标记的文件删掉?

如果这一点是系统来控制的,就有一定概率造成mmap文件被删掉了,但还有进程在读写它对应的内存,因为这块内存的back文件不存在了,就会造成BUS_ADRERR错误。

@garryyan
Copy link
Collaborator

garryyan commented May 8, 2017

这里产生这个问题的原因有两种: 1. 内存对齐的问题 2. mmap越界

你说的这个删除的问题和mmap文件无关,和linux的文件系统有关,一般来说删除一个文件只是把这一块标记为可重用,并不是彻底丢掉。在覆盖重写之前,这一块数据其实一直还在存储上,只不过是不可达的,但是如果在删除前已有文件句柄指向,即使删除文件后这个句柄依然有效。

@buptlingfeng
Copy link
Author

buptlingfeng commented May 8, 2017 via email

@buptlingfeng
Copy link
Author

buptlingfeng commented May 8, 2017 via email

@FelixZhang00
Copy link

@buptlingfeng 你的意思是这样初始化:

        char *buffer = new char[kBufferBlockLength];
        sg_log_buff = new LogBuffer(buffer, kBufferBlockLength, true);
        use_mmap = false;

@buptlingfeng
Copy link
Author

buptlingfeng commented May 8, 2017 via email

@FelixZhang00
Copy link

翻过来,模拟过mmap越界操作吗?必现crash?

@garryyan garryyan added the bug label May 19, 2017
@garryyan
Copy link
Collaborator

garryyan commented Jun 19, 2017

这个问题已查明。
原因:mmap 文件放在sdcard目录被删除掉或者sdcard短时间内不可用导致用时crash。
暂时的解决办法:appenderOpen时第三个参数,缓存路径不要传空串,传你应用程序包目录下的文件路径, 比如 微信会给 /data/data/com.tencent.mm/files/xlog。这样 mmap文件会放在这个路径,测试办法:找一台root的手机,看你传的缓存目录里是否有mmap文件。
后续我会试图找到不使用缓存路径的解决办法。

注意:日志不要放在这个目录,不然就太占 data 空间了。缓存目录类似日志目录,要单独目录,防止清理逻辑误删其他文件

@FelixZhang00
Copy link

我这里缓存路径是传空的,我改下试试。

@FelixZhang00
Copy link

@buptlingfeng 你们也没有传缓存路径吗

@buptlingfeng
Copy link
Author

buptlingfeng commented Jun 19, 2017 via email

@logwee
Copy link

logwee commented Jul 12, 2017

我设置了缓存路劲,现在有丢日志的现象;

@garryyan
Copy link
Collaborator

@logwee 你的缓存路径设置的是什么?

@logwee
Copy link

logwee commented Jul 13, 2017

@garryyan /data/data/package/files/xlog 下

@garryyan
Copy link
Collaborator

package没换成你自己的包名吗? 换成自己的包名!否则 怎么可能有权限

@logwee
Copy link

logwee commented Jul 13, 2017

@garryyan 当然是自己的包名。
getContext().getFilesDir

@garryyan
Copy link
Collaborator

怎么看出丢日志的?

@logwee
Copy link

logwee commented Jul 13, 2017

找到原因了,我的问题
启动的时候有概率没有appenderOpen,就提前去写了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants