It doesn't look like you are initialising your unw_accessors_t accessors. >From libunwind-ptrace man page:
An application that wants to use the _UPT-facility first needs to create a new libunwind address-space that represents the target process. This is done by calling unw_create_addr_space(). In many cases, the application will simply want to pass the address of _UPT_accessors as the first argument to this routine On Mon, Apr 20, 2015 at 1:42 PM, Arun Prakash Jana <[email protected]> wrote: > Hi, > > I am writing a small test program to check how libunwind can be used to > trace a remote program. > > A call to unw_init_remote() throws SIGSEGV. > > *Relevant code snippet:* > ------------------ > unw_addr_space_t addrspace; > struct UPT_info *uptinfo; > unw_accessors_t accessors; > unw_cursor_t cursor; > unw_word_t RIP, RBP; > > pid_t PID = 1; > int ret = 0; > > if (argc !=2) { > fprintf(stderr, "Usage: unwind PID\n"); > return -1; > } > > if ((PID = atoi(argv[1])) <= 0) { > fprintf(stderr, "Valid PID please!\n"); > return -1; > } > > fprintf(stdout, "Tracing PID: %d\n", PID); > > /* Create address space for little endian */ > addrspace = unw_create_addr_space(&accessors, 0); > if (!addrspace) { > fprintf(stderr, "unw_create_addr_space failed\n"); > return -1; > } > > uptinfo = (struct UPT_info *)_UPT_create(PID); > if (!uptinfo) { > fprintf(stderr, "_UPT_create failed\n"); > goto bail; > } > > ret = unw_init_remote(&cursor, addrspace, uptinfo); > if (ret < 0) { > fprintf(stderr, "unw_init_remote failed\n"); > goto bail; > } > ------------------ > > *strace output:* > ------------------ > > strace ./unwind 8423 > execve("./unwind", ["./unwind", "8423"], [/* 85 vars */]) = 0 > brk(0) = 0x1cdd000 > access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or > directory) > mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = > 0x7fc136cc9000 > access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or > directory) > open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 > fstat(3, {st_mode=S_IFREG|0644, st_size=81750, ...}) = 0 > mmap(NULL, 81750, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc136cb5000 > close(3) = 0 > access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or > directory) > open("/usr/lib/x86_64-linux-gnu/libunwind-x86_64.so.8", > O_RDONLY|O_CLOEXEC) = 3 > read(3, > "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\27\0\0\0\0\0\0"..., 832) = > 832 > fstat(3, {st_mode=S_IFREG|0644, st_size=67608, ...}) = 0 > mmap(NULL, 2223816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) > = 0x7fc13688a000 > mprotect(0x7fc13689a000, 2093056, PROT_NONE) = 0 > mmap(0x7fc136a99000, 8192, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x7fc136a99000 > mmap(0x7fc136a9b000, 57032, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc136a9b000 > close(3) = 0 > access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or > directory) > open("/usr/lib/x86_64-linux-gnu/libunwind-ptrace.so.0", > O_RDONLY|O_CLOEXEC) = 3 > read(3, > "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\17\0\0\0\0\0\0"..., 832) > = 832 > fstat(3, {st_mode=S_IFREG|0644, st_size=14528, ...}) = 0 > mmap(NULL, 2109736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) > = 0x7fc136686000 > mprotect(0x7fc136689000, 2093056, PROT_NONE) = 0 > mmap(0x7fc136888000, 8192, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fc136888000 > close(3) = 0 > access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or > directory) > open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 > read(3, > "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., > 832) = 832 > fstat(3, {st_mode=S_IFREG|0755, st_size=1840928, ...}) = 0 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = > 0x7fc136cb4000 > mmap(NULL, 3949248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) > = 0x7fc1362c1000 > mprotect(0x7fc13647c000, 2093056, PROT_NONE) = 0 > mmap(0x7fc13667b000, 24576, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ba000) = 0x7fc13667b000 > mmap(0x7fc136681000, 17088, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc136681000 > close(3) = 0 > access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or > directory) > open("/usr/lib/x86_64-linux-gnu/libunwind.so.8", O_RDONLY|O_CLOEXEC) = 3 > read(3, > "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\37\0\0\0\0\0\0"..., 832) > = 832 > fstat(3, {st_mode=S_IFREG|0644, st_size=51192, ...}) = 0 > mmap(NULL, 2207464, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) > = 0x7fc1360a6000 > mprotect(0x7fc1360b2000, 2093056, PROT_NONE) = 0 > mmap(0x7fc1362b1000, 8192, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb000) = 0x7fc1362b1000 > mmap(0x7fc1362b3000, 57064, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc1362b3000 > close(3) = 0 > access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or > directory) > open("/lib/x86_64-linux-gnu/liblzma.so.5", O_RDONLY|O_CLOEXEC) = 3 > read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320 > \0\0\0\0\0\0"..., 832) = 832 > fstat(3, {st_mode=S_IFREG|0644, st_size=137400, ...}) = 0 > mmap(NULL, 2232456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) > = 0x7fc135e84000 > mprotect(0x7fc135ea5000, 2093056, PROT_NONE) = 0 > mmap(0x7fc1360a4000, 8192, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x20000) = 0x7fc1360a4000 > close(3) = 0 > access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or > directory) > open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3 > read(3, > "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\0\0\0\0\0\0"..., > 832) = 832 > fstat(3, {st_mode=S_IFREG|0644, st_size=14664, ...}) = 0 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = > 0x7fc136cb3000 > mmap(NULL, 2109744, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) > = 0x7fc135c80000 > mprotect(0x7fc135c83000, 2093056, PROT_NONE) = 0 > mmap(0x7fc135e82000, 8192, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fc135e82000 > close(3) = 0 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = > 0x7fc136cb2000 > mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = > 0x7fc136cb0000 > arch_prctl(ARCH_SET_FS, 0x7fc136cb0780) = 0 > mprotect(0x7fc13667b000, 16384, PROT_READ) = 0 > mprotect(0x7fc135e82000, 4096, PROT_READ) = 0 > mprotect(0x7fc1360a4000, 4096, PROT_READ) = 0 > mprotect(0x7fc1362b1000, 4096, PROT_READ) = 0 > mprotect(0x7fc136888000, 4096, PROT_READ) = 0 > mprotect(0x7fc136a99000, 4096, PROT_READ) = 0 > mprotect(0x601000, 4096, PROT_READ) = 0 > mprotect(0x7fc136ccb000, 4096, PROT_READ) = 0 > munmap(0x7fc136cb5000, 81750) = 0 > fstat(1, {st_mode=S_IFREG|0664, st_size=5320, ...}) = 0 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = > 0x7fc136cc8000 > brk(0) = 0x1cdd000 > brk(0x1d08000) = 0x1d08000 > rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = > 0x7fc136cc7000 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = > 0x7fc136cc6000 > mincore(0x7ffd4ae65b3f, 1, 0x7ffd4ae65b3f) = -1 EINVAL (Invalid argument) > rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 > --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} --- > +++ killed by SIGSEGV +++ > fish: Job 1, “strace ./unwind 8423 > strace.log 2>&1” terminated by signal > SIGSEGV (Address boundary error) > ------------------ > > I am on Ubuntu 14.04 (arch: x86_64). Can someone please explain what I'm > doing wrong? > > Regards, > > Arun > > _______________________________________________ > Libunwind-devel mailing list > [email protected] > https://lists.nongnu.org/mailman/listinfo/libunwind-devel > >
_______________________________________________ Libunwind-devel mailing list [email protected] https://lists.nongnu.org/mailman/listinfo/libunwind-devel
