#intel-sgx #backtrace #sgx-sdk #confidential-computing #applications #write #run-time

nightly no-std sgx_backtrace

Rust SGX SDK provides the ability to write Intel SGX applications in Rust Programming Language

3 stable releases

1.1.1 Apr 3, 2020
1.1.0 Dec 19, 2019
1.0.9 Sep 16, 2019

#1790 in Hardware support

Custom license

775KB
14K SLoC

Rust 9K SLoC // 0.1% comments C 4K SLoC // 0.2% comments Shell 1.5K SLoC // 0.1% comments M4 119 SLoC // 0.4% comments Automake 106 SLoC // 0.4% comments GNU Style Assembly 29 SLoC // 0.5% comments Bazel 5 SLoC AWK 2 SLoC

Note

Please visit our homepage for usage. Thanks!


lib.rs:

A library for acquiring a backtrace at runtime

This library is meant to supplement the RUST_BACKTRACE=1 support of the standard library by allowing an acquisition of a backtrace at runtime programmatically. The backtraces generated by this library do not need to be parsed, for example, and expose the functionality of multiple backend implementations.

Implementation

This library makes use of a number of strategies for actually acquiring a backtrace. For example unix uses libgcc's libunwind bindings by default to acquire a backtrace, but coresymbolication or dladdr is used on OSX to acquire symbol names while linux uses gcc's libbacktrace.

When using the default feature set of this library the "most reasonable" set of defaults is chosen for the current platform, but the features activated can also be controlled at a finer granularity.

API Principles

This library attempts to be as flexible as possible to accommodate different backend implementations of acquiring a backtrace. Consequently the currently exported functions are closure-based as opposed to the likely expected iterator-based versions. This is done due to limitations of the underlying APIs used from the system.

Usage

First, add this to your Cargo.toml

[dependencies]
sgx_backtrace = "1.0.8"

Next:

extern crate sgx_backtrace;

fn main() {
    sgx_backtrace::set_enclave_path("enclave.signed.so");
    sgx_backtrace::trace(|frame| {
        let ip = frame.ip();
        let symbol_address = frame.symbol_address();

        // Resolve this instruction pointer to a symbol name
        sgx_backtrace::resolve_frame(frame, |symbol| {
            if let Some(name) = symbol.name() {
                // ...
            }
            if let Some(filename) = symbol.filename() {
                // ...
            }
        });

        true // keep going to the next frame
    });
}

Dependencies

~2MB
~42K SLoC