mmap: sigbus error



  • Hallo zusammen
    Habe eine Datei mit mmap ausgelagert und versuche diese nun zu beschreiben.
    Dabei erhalte ich aber staendig einen sigbus error. ich hab das ganze mal mit
    strace aufgezeichnet, werde aber nicht schlau daraus.

    Was ich seltsam finde ist, dass wenn ich mit dem Debugger (gdb) jede Zeile
    Schritt fuer Schritt durchgehe, dann funktionert es bis //1 d.h. er macht das
    memcpy in das Ram. Falls ich einen Breakpoint bei //1 setzte und ihn
    durchlaufen lasse, bricht er nach dem ersten memcpy ab.

    #include <fcntl.h>
    #include <iostream>
    #include <string>
    #include <sys/types.h>
    #include <sys/mman.h>
    using namespace std;
    
    int main(){
    	string r="Hello World !!!\n";
     	char* h=(char*)r.c_str();
     	size_t len=1024;		
    	string t="/integra/eclipseworks/mmap/test"; 
    	int fd= open(t.c_str(),O_RDWR|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
    	char* s= (char*) mmap(0,len,PROT_READ | PROT_WRITE |PROT_EXEC ,MAP_SHARED,fd,0);
    	unsigned long i;
    
    	for  (i=0;i<5;i++){
    		memcpy(s+i*strlen(h),h ,strlen(h));
    	}
    	//1
    	msync(s,len,MS_ASYNC);
    	munmap(s,len);
    	close(fd);
    
    	return 0;
    }
    

    Hier der strace- Auszug

    strace ./Debug/mmap
    execve("./Debug/mmap", ["./Debug/mmap"], [/* 72 vars /]) = 0
    uname({sys="Linux", node="linux", ...}) = 0
    brk(0) = 0x804a000
    old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000
    open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/etc/ld.so.cache", O_RDONLY) = 3
    fstat64(3, {st_mode=S_IFREG|0644, st_size=75564, ...}) = 0
    old_mmap(NULL, 75564, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
    close(3) = 0
    open("/usr/lib/libstdc++.so.5", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20\247"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=965717, ...}) = 0
    old_mmap(NULL, 766620, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4002b000
    madvise(0x4002b000, 766620, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x400cc000, 90112, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xa0000) = 0x400cc000
    old_mmap(0x400e2000, 17052, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400e2000
    close(3) = 0
    open("/lib/tls/libm.so.6", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p5\0\000"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=170563, ...}) = 0
    old_mmap(NULL, 137712, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x400e7000
    madvise(0x400e7000, 137712, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x40108000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x40108000
    close(3) = 0
    open("/lib/libgcc_s.so.1", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\25\0\000"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=40171, ...}) = 0
    old_mmap(NULL, 30456, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40109000
    madvise(0x40109000, 30456, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x40110000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x7000) = 0x40110000
    close(3) = 0
    open("/lib/tls/libc.so.6", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360U\1"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=1349081, ...}) = 0
    old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40111000
    old_mmap(NULL, 1132940, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40112000
    madvise(0x40112000, 1132940, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x4021c000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x10a000) = 0x4021c000
    old_mmap(0x40224000, 10636, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40224000
    close(3) = 0
    set_thread_area({entry_number:-1 -> 6, base_addr:0x40111a40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
    munmap(0x40018000, 75564) = 0
    brk(0) = 0x804a000
    brk(0x806b000) = 0x806b000
    brk(0) = 0x806b000
    open("/integra/eclipseworks/mmap/test", O_RDWR|O_CREAT, 0777) = 3
    mmap2(NULL, 1024, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED, 3, 0) = 0x40018000
    --- SIGBUS (Bus error) @ 0 (0) ---
    +++ killed by SIGBUS +++
    strace ./Debug/mmap
    execve("./Debug/mmap", ["./Debug/mmap"], [/
    72 vars */]) = 0
    uname({sys="Linux", node="linux", ...}) = 0
    brk(0) = 0x804a000
    old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40017000
    open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory)
    open("/etc/ld.so.cache", O_RDONLY) = 3
    fstat64(3, {st_mode=S_IFREG|0644, st_size=75564, ...}) = 0
    old_mmap(NULL, 75564, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40018000
    close(3) = 0
    open("/usr/lib/libstdc++.so.5", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20\247"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=965717, ...}) = 0
    old_mmap(NULL, 766620, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x4002b000
    madvise(0x4002b000, 766620, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x400cc000, 90112, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xa0000) = 0x400cc000
    old_mmap(0x400e2000, 17052, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400e2000
    close(3) = 0
    open("/lib/tls/libm.so.6", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p5\0\000"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=170563, ...}) = 0
    old_mmap(NULL, 137712, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x400e7000
    madvise(0x400e7000, 137712, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x40108000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x20000) = 0x40108000
    close(3) = 0
    open("/lib/libgcc_s.so.1", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\25\0\000"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=40171, ...}) = 0
    old_mmap(NULL, 30456, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40109000
    madvise(0x40109000, 30456, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x40110000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x7000) = 0x40110000
    close(3) = 0
    open("/lib/tls/libc.so.6", O_RDONLY) = 3
    read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360U\1"..., 512) = 512
    fstat64(3, {st_mode=S_IFREG|0755, st_size=1349081, ...}) = 0
    old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40111000
    old_mmap(NULL, 1132940, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40112000
    madvise(0x40112000, 1132940, MADV_SEQUENTIAL|0x1) = 0
    old_mmap(0x4021c000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x10a000) = 0x4021c000
    old_mmap(0x40224000, 10636, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40224000
    close(3) = 0
    set_thread_area({entry_number:-1 -> 6, base_addr:0x40111a40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
    munmap(0x40018000, 75564) = 0
    brk(0) = 0x804a000
    brk(0x806b000) = 0x806b000
    brk(0) = 0x806b000
    open("/integra/eclipseworks/mmap/test", O_RDWR|O_CREAT, 0777) = 3
    //file kann geoffnet werden (fd=3)
    mmap2(NULL, 1024, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED, 3, 0) = 0x40018000
    --- SIGBUS (Bus error) @ 0 (0) ---
    +++ killed by SIGBUS +++

    Habe folgende Versionen:
    GCC: 3.3.3
    libc.so.6
    libstdc++.so.5.0.5

    gruess borowski


Anmelden zum Antworten