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

Reply via email to