libunwind-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Libunwind-devel] unw_init_remote call results in SIGSEGV


From: Arun Prakash Jana
Subject: [Libunwind-devel] unw_init_remote call results in SIGSEGV
Date: Mon, 20 Apr 2015 21:16:42 +0530

Earlier I missed PTRACE_ATTACH. Added it. However, it still fails with SIGSEGV.

Current code:
---------------------------
int main(int argc, char **argv)
{
        unw_addr_space_t addrspace;
        struct UPT_info *uptinfo = NULL;
        unw_accessors_t accessors;
        unw_cursor_t cursor;
        unw_word_t RIP, RBP;

        pid_t PID = 1;
        int ret = 0, wait_loops = 20, wait_time = 1000, waitstatus, stopped = 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;
        }

        ret = ptrace(PTRACE_ATTACH, PID, NULL, NULL);
        if (0 != ret && 0 != errno) {
                ret = errno;    
                return ret; 
        }

        while (wait_loops-- > 0) {
                ret = waitpid(PID, &waitstatus, WUNTRACED | WNOHANG);
                if (WIFSTOPPED(waitstatus)) {
                        stopped = 1;
                        break;
                }
                usleep(wait_time);
        }

        if (!stopped) {
                fprintf(stderr, "Traget process couldn't be stopped\n");
                goto bail;
        }

        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;
        }

        if (unw_get_reg(&cursor, UNW_X86_64_RIP, &RIP) < 0 || 
unw_get_reg(&cursor, UNW_X86_64_RBP, &RBP)) {
                fprintf(stderr, "unw_get_reg RIP/RBP failed\n");
                goto bail;
        }

        fprintf(stdout, "RIP: 0x%lx\n", RIP);
        fprintf(stdout, "RBP: 0x%lx\n", RBP);

bail:
        if (uptinfo)
                _UPT_destroy(uptinfo);

        unw_destroy_addr_space(addrspace);

        return 0;
}
---------------------------

strace output:
---------------------------
execve("./unwind", ["./unwind", "23034"], [/* 28 vars */]) = 0
brk(0)                                  = 0x1173000
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) = 
0x7fdd7f220000
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) = 0x7fdd7f20c000
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) = 
0x7fdd7ede1000
mprotect(0x7fdd7edf1000, 2093056, PROT_NONE) = 0
mmap(0x7fdd7eff0000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xf000) = 0x7fdd7eff0000
mmap(0x7fdd7eff2000, 57032, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fdd7eff2000
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) = 
0x7fdd7ebdd000
mprotect(0x7fdd7ebe0000, 2093056, PROT_NONE) = 0
mmap(0x7fdd7eddf000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fdd7eddf000
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) = 
0x7fdd7f20b000
mmap(NULL, 3949248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0x7fdd7e818000
mprotect(0x7fdd7e9d3000, 2093056, PROT_NONE) = 0
mmap(0x7fdd7ebd2000, 24576, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ba000) = 0x7fdd7ebd2000
mmap(0x7fdd7ebd8000, 17088, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fdd7ebd8000
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) = 
0x7fdd7e5fd000
mprotect(0x7fdd7e609000, 2093056, PROT_NONE) = 0
mmap(0x7fdd7e808000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xb000) = 0x7fdd7e808000
mmap(0x7fdd7e80a000, 57064, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fdd7e80a000
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) = 
0x7fdd7e3db000
mprotect(0x7fdd7e3fc000, 2093056, PROT_NONE) = 0
mmap(0x7fdd7e5fb000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x20000) = 0x7fdd7e5fb000
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) = 
0x7fdd7f20a000
mmap(NULL, 2109744, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 
0x7fdd7e1d7000
mprotect(0x7fdd7e1da000, 2093056, PROT_NONE) = 0
mmap(0x7fdd7e3d9000, 8192, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fdd7e3d9000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7fdd7f209000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7fdd7f207000
arch_prctl(ARCH_SET_FS, 0x7fdd7f207780) = 0
mprotect(0x7fdd7ebd2000, 16384, PROT_READ) = 0
mprotect(0x7fdd7e3d9000, 4096, PROT_READ) = 0
mprotect(0x7fdd7e5fb000, 4096, PROT_READ) = 0
mprotect(0x7fdd7e808000, 4096, PROT_READ) = 0
mprotect(0x7fdd7eddf000, 4096, PROT_READ) = 0
mprotect(0x7fdd7eff0000, 4096, PROT_READ) = 0
mprotect(0x601000, 4096, PROT_READ)     = 0
mprotect(0x7fdd7f222000, 4096, PROT_READ) = 0
munmap(0x7fdd7f20c000, 81750)           = 0
fstat(1, {st_mode=S_IFREG|0664, st_size=5321, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7fdd7f21f000
brk(0)                                  = 0x1173000
brk(0x119e000)                          = 0x119e000
ptrace(PTRACE_ATTACH, 23034, 0, 0)      = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_TRAPPED, si_pid=23034, 
si_status=SIGSTOP, si_utime=336, si_stime=14} ---
wait4(23034, [{WIFSTOPPED(s) && WSTOPSIG(s) == SIGSTOP}], WNOHANG|WSTOPPED, 
NULL) = 23034
rt_sigprocmask(SIG_SETMASK, ~[RTMIN RT_1], [], 8) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7fdd7f21e000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 
0x7fdd7f21d000
mincore(0x7ffecf71ba4f, 1, 0x7ffecf71ba4f) = -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 +++
---------------------------

Appreciate any help with this.

Regards,

Arun



reply via email to

[Prev in Thread] Current Thread [Next in Thread]