LLDB: NetBSD Process Plugin enhancements


May 02, 2017 posted by Kamil Rytarowski

Last month I have worked on features of the Process Plugin on NetBSD and support for threads in core(5) files.

What has been done in NetBSD

I've managed to achieve the following accomplishments:

Introduction of PT_SETSTEP and PT_CLEARSTEP

This allows to:

  • singlestep particular threads,
  • combine PT_STEP with PT_SYSCALL,
  • combine PT_STEP and emission of a signal.

There are equivalent operations in FreeBSD with the same names.

Introduction of helper macro PTRACE_BREAKPOINT_ASM

This code was prepared by Nick Hudson and it was used in ATF tests to verify behavior of software breakpoints.

Addition of new sysctl(2) functions

Add new defines in sysctl(2) on amd64 and i386 ports. These values are defined in <x86/cpu.h>:

  • CPU_FPU_SAVE (15)
       int: FPU Instructions layout
       * to use this, CPU_OSFXSR must be true
       * 0: FSAVE
       * 1: FXSAVE
       * 2: XSAVE
       * 3: XSAVEOPT
    
  • CPU_FPU_SAVE_SIZE (16)
       int: FPU Instruction layout size
    
  • CPU_XSAVE_FEATURES (17)
       quad: FPU XSAVE features
    
  • Bump CPU_MAXID from 15 to 18.

These values are useful to get FPU (floating point unit) properties in e.g. a debugger. This information is required to properly implement FPR (floating point register) tracer operations on x86 processors.

Corrections in ptrace(2) man-page

Few mistakes were corrected to make the documentation more correct.

ATF tests cleanup in ptrace(2)

There were added new tests for new ptrace(2) operations (PT_SETSTEP and PT_CLEARSTEP).

Also several tests were updated to reflect the current state of "successfully passed" and "expected failure". This is important to mark issues that are already known and quickly catch new regressions in future changes.

F_GETPATH in fcntl(2)

It was decided that NetBSD will not introduce new fcntl(2) function for compatibility with certain other systems. This means that once LLDB will require this feature, we will need to introduce a workaround in the project.

What has been done in LLDB

The NetBSD Process Plugin in LLDB acquired new capabilities. Additionally enhancements in LLDB were developed such as handling threads in core(5) files.

Floating point support

The x86_64 architecture supports in default properties FXSAVE processor instructions. The FXSAVE feature allows to operate over floating point registers. A thread state (context) is composed of (and not restricted to) general and floating point registers.

The NetBSD Process Plugin acquired the functionality to read these registers and optionally set new values for them.

Watchpoint support

A programmer can use hardware assisted watchpoints to stop execution of a tracee whenever a certain variable or instruction was read/written/executed. The support for this feature has been implemented on NetBSD with ptrace(2) operations PT_SETDBREGS and PT_GETDBREGS. These operations are now available in the LLDB Process plugin.

Threads support in core(5) files

I've included support for LWPs in core(5) files. This means that larger programs with threads, like Firefox that emitted coredump for some reason (usually during crash) can be investigated postmortem.

Demo

I've prepared a recording with the script(1) utility from the NetBSD base system. To replay it:

script -p ./firefox-core.typescript

This recording shows a debugging session of a Firefox core(5) file.

(I was kind to prepare a Linux version of the NetBSD script(1) here).

Plan for the next milestone

The plan for the next milestone is continuing development of threads in the NetBSD Process Plugin. I will need to work more on correctness of ptrace(2) calls as new issues were detected in setups with threads that resulted in crashes.

There is also ongoing work on a new build node running NetBSD-current (prerelease of 8) and building LLVM+Clang+LLDB. I'm working on enabling unit tests to catch functional regressions quickly. The original LLDB node cluster was privately funded by myself in the last two years and has been switched to a machine hosted by The NetBSD Foundation.

To keep this machine up and running (8 CPU, 24 GB RAM) community support through donations is required. This is crucial to actively maintain the LLVM toolchain (Clang, LLDB and others) on NetBSD.

This work was sponsored by The NetBSD Foundation.

The NetBSD Foundation is a non-profit organization and welcomes any donations to help us continue funding projects and services to the open-source community. Please consider visiting the following URL, and chip in what you can:

http://netbsd.org/donations/#how-to-donate [0 comments]

 



Post a Comment:
  • HTML Syntax: NOT allowed