B
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