Hello,
 
I am running Linux Ubuntu 14.04 and I tried both LLDB-3.6 (installed binaries 
using apt-get) and LLDB-3.7 (built from sources sync'ed to trunk), the result 
is the same.
 
I have a simple program (the source code is at the bottom of the message) that 
maps a page of memory as not accessible, installs a SIGSEGV handler that remaps 
this page as read-write, and then tries to read from it. So, the expected 
result is that program initially receives SIGSEGV but happily continues after 
the handler fixes the problem.
 
The program runs as expected, both standalone and under GDB:
 
$ ./mm
signal 11 received
success 777

$ gdb --quiet ./mm
Reading symbols from ./mm...done.
(gdb) r
Starting program: /home/eugene/tmp/mm
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400acc in main () at mm.cpp:27
27          int x = *(int*)address;
(gdb) c
Continuing.
signal 11 received
success 777
[Inferior 1 (process 14155) exited normally]
(gdb) q

But under LLDB it spins forever on failing instruction without invoking the 
signal handler. Also, setting "process handle" does not have any effect at all:
 
$ ~/llvm/bin/lldb ./mm
(lldb) target create "./mm"
Current executable set to './mm' (x86_64).
(lldb) br se -b main
Breakpoint 1: where = mm`main + 30 at mm.cpp:24, address = 0x0000000000400a7e
(lldb) pr lau
Process 14194 launched: './mm' (x86_64)
Process 14194 stopped
* thread #1: tid = 14194, 0x0000000000400a7e mm`main + 30 at mm.cpp:24, name = 
'mm', stop reason = breakpoint 1.1
    frame #0: 0x0000000000400a7e mm`main + 30 at mm.cpp:24
   21
   22   int main()
   23   {
-> 24       sigset(SIGSEGV, handler);
   25
   26       address = mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, 
-1, 0);
   27       int x = *(int*)address;
(lldb) pr ha SIGSEGV -s false -p true -n false
NAME        PASS   STOP   NOTIFY
==========  =====  =====  ======
SIGSEGV     true   false  false
(lldb) c
Process 14194 resuming
Process 14194 stopped
* thread #1: tid = 14194, 0x0000000000400acc mm`main + 108 at mm.cpp:27, name = 
'mm', stop reason = address access protected (fault address: 0x7ffff7ff7000)
    frame #0: 0x0000000000400acc mm`main + 108 at mm.cpp:27
   24       sigset(SIGSEGV, handler);
   25
   26       address = mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, 
-1, 0);
-> 27       int x = *(int*)address;
   28       std::cout << (signaled ? "success " : "failure ") << x << "\n";
   29   }
(lldb) c
Process 14194 resuming
Process 14194 stopped
* thread #1: tid = 14194, 0x0000000000400acc mm`main + 108 at mm.cpp:27, name = 
'mm', stop reason = address access protected (fault address: 0x7ffff7ff7000)
    frame #0: 0x0000000000400acc mm`main + 108 at mm.cpp:27
   24       sigset(SIGSEGV, handler);
   25
   26       address = mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, 
-1, 0);
-> 27       int x = *(int*)address;
   28       std::cout << (signaled ? "success " : "failure ") << x << "\n";
   29   }
(lldb) c
Process 14194 resuming
Process 14194 stopped
* thread #1: tid = 14194, 0x0000000000400acc mm`main + 108 at mm.cpp:27, name = 
'mm', stop reason = address access protected (fault address: 0x7ffff7ff7000)
    frame #0: 0x0000000000400acc mm`main + 108 at mm.cpp:27
   24       sigset(SIGSEGV, handler);
   25
   26       address = mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, 
-1, 0);
-> 27       int x = *(int*)address;
   28       std::cout << (signaled ? "success " : "failure ") << x << "\n";
   29   }
(lldb)

So, do I miss some LLDB setting?
Here is the program code:
 
$ cat mm.cpp
#include <iostream>
#include <sys/mman.h>
#include <signal.h>
#include <assert.h>
#include <sys/types.h>
#include <unistd.h>
 
void* address;
size_t size = 0x1000;
bool signaled = false;
 
void handler(int sig)
{
    std::cout << "signal " << sig << " received\n";
    signaled = true;
    munmap(address, size);
    void* newaddr = mmap(address, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | 
MAP_FIXED | MAP_PRIVATE, -1, 0);
    assert(newaddr == address);
    *(int*)newaddr = 777;
}
 
int main()
{
    sigset(SIGSEGV, handler);
    address = mmap(NULL, size, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
    int x = *(int*)address;
    std::cout << (signaled ? "success " : "failure ") << x << "\n";
}
$

Thanks,
Eugene
 
 
                                          
_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to