facebookexperimental / hermit

Hermit launches linux x86_64 programs in a special, hermetically isolated sandbox to control their execution. Hermit translates normal, nondeterministic behavior, into deterministic, repeatable behavior. This can be used for various applications, including replay-debugging, reproducible artifacts, chaos mode concurrency testing and bug analysis.
Other
1.19k stars 31 forks source link

Build Prerequisites #43

Closed MichaelSnowden closed 11 months ago

MichaelSnowden commented 11 months ago

Feature Description

I'd like some instructions on what prerequisites are needed to build Hermit. The documentation only mentions running cargo build, but that does not work for me out of the box on the rust Docker image. I've also tried using the Dockerfile in the docker branch here, but that doesn't even have cargo.

Here's what the output looks like if I try building on the latest rust Docker image:

$ docker run -it rust # on host
$ rustc --version # in container
rustc 1.75.0-nightly (0f44eb32f 2023-11-09)
$ git clone https://github.com/facebookexperimental/hermit
$ apt-get update
$ apt-get install libunwind-dev # based on steps in .github/workflows
$ cargo build
warning: virtual workspace defaulting to `resolver = "1"` despite one or more workspace members being on edition 2021 which implies `resolver = "2"`
note: to keep the current resolver, specify `workspace.resolver = "1"` in the workspace root's manifest
note: to use the edition 2021 resolver, specify `workspace.resolver = "2"` in the workspace root's manifest
note: for more details see https://doc.rust-lang.org/cargo/reference/resolver.html#resolver-versions
   Compiling detcore v0.0.0 (/hermit/detcore)
   Compiling regex-automata v0.1.10
   Compiling overload v0.1.1
   Compiling unwind-sys v0.1.3
   Compiling time-core v0.1.2
   Compiling num_threads v0.1.6
   Compiling nu-ansi-term v0.46.0
   Compiling time v0.3.30
   Compiling tracing-log v0.1.4
   Compiling tracing-serde v0.1.3
   Compiling sharded-slab v0.1.7
error[E0432]: unresolved import `raw_cpuid::cpuid`
   --> detcore/src/lib.rs:50:5
    |
50  | use raw_cpuid::cpuid;
    |     ^^^^^^^^^^^-----
    |     |          |
    |     |          help: a similar name exists in the module (notice the capitalization): `CpuId`
    |     no `cpuid` in the root
    |
note: found an item that was configured out
   --> /usr/local/cargo/registry/src/index.crates.io-6f17d22bba15001f/raw-cpuid-10.7.0/src/lib.rs:128:14
    |
128 | macro_rules! cpuid {
    |              ^^^^^

error[E0432]: unresolved import `reverie::syscalls::Fork`
  --> detcore/src/lib.rs:58:5
   |
58 | use reverie::syscalls::Fork;
   |     ^^^^^^^^^^^^^^^^^^^^^^^ no `Fork` in the root

error[E0432]: unresolved import `reverie::Rdtsc`
  --> detcore/src/lib.rs:68:5
   |
68 | use reverie::Rdtsc;
   |     ^^^^^^^^^^^^^^ no `Rdtsc` in the root
   |
help: consider importing one of these items instead
   |
68 | use crate::Op::Rdtsc;
   |     ~~~~~~~~~~~~~~~~
68 | use detcore_model::schedule::Op::Rdtsc;
   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

error[E0432]: unresolved import `reverie::RdtscResult`
  --> detcore/src/lib.rs:69:5
   |
69 | use reverie::RdtscResult;
   |     ^^^^^^^^^^^^^^^^^^^^ no `RdtscResult` in the root

error: cannot determine resolution for the macro `cpuid`
   --> detcore/src/lib.rs:640:13
    |
640 |             cpuid!(eax, ecx)
    |             ^^^^^
    |
    = note: import resolution is stuck, try simplifying macro imports

   Compiling foreign-types-macros v0.2.3
error[E0407]: method `handle_cpuid_event` is not a member of trait `Tool`
   --> detcore/src/lib.rs:604:5
    |
604 |       async fn handle_cpuid_event<G: Guest<Self>>(
    |       ^        ------------------ help: there is an associated function with a similar name: `handle_timer_event`
    |  _____|
    | |
605 | |         &self,
606 | |         guest: &mut G,
607 | |         eax: u32,
...   |
643 | |         Ok(res)
644 | |     }
    | |_____^ not a member of trait `Tool`

error[E0407]: method `handle_rdtsc_event` is not a member of trait `Tool`
   --> detcore/src/lib.rs:646:5
    |
646 |       async fn handle_rdtsc_event<G: Guest<Self>>(
    |       ^        ------------------ help: there is an associated function with a similar name: `handle_timer_event`
    |  _____|
    | |
647 | |         &self,
648 | |         guest: &mut G,
649 | |         request: Rdtsc,
...   |
690 | |         result
691 | |     }
    | |_____^ not a member of trait `Tool`

error[E0412]: cannot find type `Dup2` in crate `syscalls`
   --> detcore/src/syscalls/files.rs:490:25
    |
490 |           call: syscalls::Dup2,
    |                           ^^^^ help: a struct with a similar name exists: `Dup`
    |
   ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:815:1
    |
815 | / typed_syscall! {
816 | |     pub struct Dup {
817 | |         oldfd: i32,
818 | |     }
819 | | }
    | |_- similarly named struct `Dup` defined here

error[E0412]: cannot find type `Utime` in crate `syscalls`
   --> detcore/src/syscalls/files.rs:539:25
    |
539 |         call: syscalls::Utime,
    |                         ^^^^^ not found in `syscalls`

error[E0412]: cannot find type `Utimes` in crate `syscalls`
    --> detcore/src/syscalls/files.rs:581:25
     |
581  |           call: syscalls::Utimes,
     |                           ^^^^^^ help: a struct with a similar name exists: `Times`
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:1406:1
     |
1406 | / typed_syscall! {
1407 | |     pub struct Times -> libc::clock_t {
1408 | |         buf: Option<AddrMut<libc::tms>>,
1409 | |     }
1410 | | }
     | |_- similarly named struct `Times` defined here

error[E0412]: cannot find type `Getdents` in crate `syscalls`
    --> detcore/src/syscalls/files.rs:956:25
     |
956  |           call: syscalls::Getdents,
     |                           ^^^^^^^^ help: a struct with a similar name exists: `Getdents64`
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2220:1
     |
2220 | / typed_syscall! {
2221 | |     pub struct Getdents64 {
2222 | |         fd: u32,
2223 | |         dirent: Option<AddrMut<libc::dirent64>>,
2224 | |         count: u32,
2225 | |     }
2226 | | }
     | |_- similarly named struct `Getdents64` defined here

error[E0412]: cannot find type `Poll` in crate `reverie::syscalls`
    --> detcore/src/syscalls/helpers.rs:333:49
     |
333  |   impl NonblockableSyscall for reverie::syscalls::Poll {
     |                                                   ^^^^
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2829:1
     |
2829 | / typed_syscall! {
2830 | |     pub struct Ppoll {
2831 | |         fds: Option<AddrMut<libc::pollfd>>,
2832 | |         nfds: libc::nfds_t,
...    |
2836 | |     }
2837 | | }
     | |_- similarly named struct `Ppoll` defined here
     |
help: a struct with a similar name exists
     |
333  | impl NonblockableSyscall for reverie::syscalls::Ppoll {
     |                                                 ~~~~~
help: consider importing one of these items
     |
9    + use core::task::Poll;
     |
9    + use futures::task::Poll;
     |
9    + use std::task::Poll;
     |
9    + use tokio::macros::support::Poll;
     |
help: if you import `Poll`, refer to it directly
     |
333  - impl NonblockableSyscall for reverie::syscalls::Poll {
333  + impl NonblockableSyscall for Poll {
     |

error[E0412]: cannot find type `Poll` in crate `reverie::syscalls`
    --> detcore/src/syscalls/helpers.rs:342:48
     |
342  |   impl TimeoutableSyscall for reverie::syscalls::Poll {
     |                                                  ^^^^
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2829:1
     |
2829 | / typed_syscall! {
2830 | |     pub struct Ppoll {
2831 | |         fds: Option<AddrMut<libc::pollfd>>,
2832 | |         nfds: libc::nfds_t,
...    |
2836 | |     }
2837 | | }
     | |_- similarly named struct `Ppoll` defined here
     |
help: a struct with a similar name exists
     |
342  | impl TimeoutableSyscall for reverie::syscalls::Ppoll {
     |                                                ~~~~~
help: consider importing one of these items
     |
9    + use core::task::Poll;
     |
9    + use futures::task::Poll;
     |
9    + use std::task::Poll;
     |
9    + use tokio::macros::support::Poll;
     |
help: if you import `Poll`, refer to it directly
     |
342  - impl TimeoutableSyscall for reverie::syscalls::Poll {
342  + impl TimeoutableSyscall for Poll {
     |

error[E0412]: cannot find type `EpollWait` in crate `reverie::syscalls`
    --> detcore/src/syscalls/helpers.rs:349:49
     |
349  |   impl NonblockableSyscall for reverie::syscalls::EpollWait {
     |                                                   ^^^^^^^^^ help: a struct with a similar name exists: `EpollPwait`
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2922:1
     |
2922 | / typed_syscall! {
2923 | |     pub struct EpollPwait {
2924 | |         epfd: i32,
2925 | |         events: Option<AddrMut<libc::epoll_event>>,
...    |
2930 | |     }
2931 | | }
     | |_- similarly named struct `EpollPwait` defined here

error[E0412]: cannot find type `EpollWait` in crate `reverie::syscalls`
    --> detcore/src/syscalls/helpers.rs:358:48
     |
358  |   impl TimeoutableSyscall for reverie::syscalls::EpollWait {
     |                                                  ^^^^^^^^^ help: a struct with a similar name exists: `EpollPwait`
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2922:1
     |
2922 | / typed_syscall! {
2923 | |     pub struct EpollPwait {
2924 | |         epfd: i32,
2925 | |         events: Option<AddrMut<libc::epoll_event>>,
...    |
2930 | |     }
2931 | | }
     | |_- similarly named struct `EpollPwait` defined here

error[E0412]: cannot find type `Poll` in crate `syscalls`
    --> detcore/src/syscalls/io.rs:37:32
     |
37   |   fn print_poll(call: &syscalls::Poll) {
     |                                  ^^^^
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2829:1
     |
2829 | / typed_syscall! {
2830 | |     pub struct Ppoll {
2831 | |         fds: Option<AddrMut<libc::pollfd>>,
2832 | |         nfds: libc::nfds_t,
...    |
2836 | |     }
2837 | | }
     | |_- similarly named struct `Ppoll` defined here
     |
help: a struct with a similar name exists
     |
37   | fn print_poll(call: &syscalls::Ppoll) {
     |                                ~~~~~
help: consider importing one of these items
     |
13   + use core::task::Poll;
     |
13   + use futures::task::Poll;
     |
13   + use std::task::Poll;
     |
13   + use tokio::macros::support::Poll;
     |
help: if you import `Poll`, refer to it directly
     |
37   - fn print_poll(call: &syscalls::Poll) {
37   + fn print_poll(call: &Poll) {
     |

error[E0412]: cannot find type `Poll` in crate `syscalls`
    --> detcore/src/syscalls/io.rs:58:25
     |
58   |           call: syscalls::Poll,
     |                           ^^^^
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2829:1
     |
2829 | / typed_syscall! {
2830 | |     pub struct Ppoll {
2831 | |         fds: Option<AddrMut<libc::pollfd>>,
2832 | |         nfds: libc::nfds_t,
...    |
2836 | |     }
2837 | | }
     | |_- similarly named struct `Ppoll` defined here
     |
help: a struct with a similar name exists
     |
58   |         call: syscalls::Ppoll,
     |                         ~~~~~
help: consider importing one of these items
     |
13   + use core::task::Poll;
     |
13   + use futures::task::Poll;
     |
13   + use std::task::Poll;
     |
13   + use tokio::macros::support::Poll;
     |
help: if you import `Poll`, refer to it directly
     |
58   -         call: syscalls::Poll,
58   +         call: Poll,
     |

error[E0412]: cannot find type `Poll` in crate `syscalls`
    --> detcore/src/syscalls/io.rs:75:25
     |
75   |           call: syscalls::Poll,
     |                           ^^^^
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2829:1
     |
2829 | / typed_syscall! {
2830 | |     pub struct Ppoll {
2831 | |         fds: Option<AddrMut<libc::pollfd>>,
2832 | |         nfds: libc::nfds_t,
...    |
2836 | |     }
2837 | | }
     | |_- similarly named struct `Ppoll` defined here
     |
help: a struct with a similar name exists
     |
75   |         call: syscalls::Ppoll,
     |                         ~~~~~
help: consider importing one of these items
     |
13   + use core::task::Poll;
     |
13   + use futures::task::Poll;
     |
13   + use std::task::Poll;
     |
13   + use tokio::macros::support::Poll;
     |
help: if you import `Poll`, refer to it directly
     |
75   -         call: syscalls::Poll,
75   +         call: Poll,
     |

error[E0412]: cannot find type `Poll` in crate `syscalls`
    --> detcore/src/syscalls/io.rs:93:25
     |
93   |           call: syscalls::Poll,
     |                           ^^^^
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2829:1
     |
2829 | / typed_syscall! {
2830 | |     pub struct Ppoll {
2831 | |         fds: Option<AddrMut<libc::pollfd>>,
2832 | |         nfds: libc::nfds_t,
...    |
2836 | |     }
2837 | | }
     | |_- similarly named struct `Ppoll` defined here
     |
help: a struct with a similar name exists
     |
93   |         call: syscalls::Ppoll,
     |                         ~~~~~
help: consider importing one of these items
     |
13   + use core::task::Poll;
     |
13   + use futures::task::Poll;
     |
13   + use std::task::Poll;
     |
13   + use tokio::macros::support::Poll;
     |
help: if you import `Poll`, refer to it directly
     |
93   -         call: syscalls::Poll,
93   +         call: Poll,
     |

error[E0412]: cannot find type `EpollWait` in crate `syscalls`
    --> detcore/src/syscalls/io.rs:147:25
     |
147  |           call: syscalls::EpollWait,
     |                           ^^^^^^^^^ help: a struct with a similar name exists: `EpollPwait`
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2922:1
     |
2922 | / typed_syscall! {
2923 | |     pub struct EpollPwait {
2924 | |         epfd: i32,
2925 | |         events: Option<AddrMut<libc::epoll_event>>,
...    |
2930 | |     }
2931 | | }
     | |_- similarly named struct `EpollPwait` defined here

error[E0412]: cannot find type `EpollWait` in crate `syscalls`
    --> detcore/src/syscalls/io.rs:162:25
     |
162  |           call: syscalls::EpollWait,
     |                           ^^^^^^^^^ help: a struct with a similar name exists: `EpollPwait`
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:2922:1
     |
2922 | / typed_syscall! {
2923 | |     pub struct EpollPwait {
2924 | |         epfd: i32,
2925 | |         events: Option<AddrMut<libc::epoll_event>>,
...    |
2930 | |     }
2931 | | }
     | |_- similarly named struct `EpollPwait` defined here

error[E0412]: cannot find type `Alarm` in crate `syscalls`
  --> detcore/src/syscalls/signal.rs:46:25
   |
46 |         call: syscalls::Alarm,
   |                         ^^^^^ not found in `syscalls`

error[E0412]: cannot find type `Pause` in crate `syscalls`
  --> detcore/src/syscalls/signal.rs:64:25
   |
64 |         call: syscalls::Pause,
   |                         ^^^^^ not found in `syscalls`

error[E0412]: cannot find type `Time` in crate `syscalls`
    --> detcore/src/syscalls/time.rs:121:25
     |
121  |           call: syscalls::Time,
     |                           ^^^^
     |
    ::: /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:1406:1
     |
1406 | / typed_syscall! {
1407 | |     pub struct Times -> libc::clock_t {
1408 | |         buf: Option<AddrMut<libc::tms>>,
1409 | |     }
1410 | | }
     | |_- similarly named struct `Times` defined here
     |
help: there is an enum variant `crate::TimerSchedule::Time` and 1 other; try using the variant's enum
     |
121  |         call: crate::TimerSchedule,
     |               ~~~~~~~~~~~~~~~~~~~~
121  |         call: reverie::TimerSchedule,
     |               ~~~~~~~~~~~~~~~~~~~~~~
help: a struct with a similar name exists
     |
121  |         call: syscalls::Times,
     |                         ~~~~~

   Compiling matchers v0.1.0
   Compiling scroll_derive v0.11.1
   Compiling thread_local v1.1.7
error[E0609]: no field `rip` on type `user_regs_struct`
   --> detcore/src/syscalls/helpers.rs:760:42
    |
760 |     let end_rip = NonZeroUsize::new(regs.rip.try_into().unwrap()).unwrap();
    |                                          ^^^ unknown field
    |
    = note: available fields are: `regs`, `sp`, `pc`, `pstate`

error[E0609]: no field `rip` on type `user_regs_struct`
    --> detcore/src/tool_global.rs:1476:36
     |
1476 |             NonZeroUsize::new(regs.rip.try_into().unwrap()).unwrap()
     |                                    ^^^ unknown field
     |
     = note: available fields are: `regs`, `sp`, `pc`, `pstate`

   Compiling foreign-types-shared v0.3.1
   Compiling crossbeam-utils v0.8.16
   Compiling unwind v0.4.1
   Compiling foreign-types v0.5.0
   Compiling tracing-subscriber v0.3.17
error[E0599]: no variant or associated item named `Poll` found for enum `reverie::reverie_syscalls::Syscall` in the current scope
   --> detcore/src/syscalls/io.rs:105:60
    |
105 |                 .record_or_replay_blocking(guest, Syscall::Poll(call))
    |                                                            ^^^^
    |                                                            |
    |                                                            variant or associated item not found in `Syscall`
    |                                                            help: there is a variant with a similar name: `Ppoll`
    |
note: if you're trying to build a new `reverie::reverie_syscalls::Syscall`, consider using `reverie::reverie_syscalls::Syscall::from_raw` which returns `reverie::reverie_syscalls::Syscall`
   --> /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:68:1
    |
68  | / syscall_list! {
69  | |     /// Full list of type-safe syscalls.
70  | |     #[derive(Debug, Copy, Clone, Eq, PartialEq)]
71  | |     #[allow(missing_docs)]
...   |
494 | |     }
495 | | }
    | |_^
    = note: this error originates in the macro `syscall_list` (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0599]: no variant or associated item named `EpollWait` found for enum `reverie::reverie_syscalls::Syscall` in the current scope
   --> detcore/src/syscalls/io.rs:151:60
    |
151 |                 .record_or_replay_blocking(guest, Syscall::EpollWait(call))
    |                                                            ^^^^^^^^^
    |                                                            |
    |                                                            variant or associated item not found in `Syscall`
    |                                                            help: there is a variant with a similar name: `EpollPwait`
    |
note: if you're trying to build a new `reverie::reverie_syscalls::Syscall`, consider using `reverie::reverie_syscalls::Syscall::from_raw` which returns `reverie::reverie_syscalls::Syscall`
   --> /usr/local/cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-syscalls/src/syscalls/mod.rs:68:1
    |
68  | / syscall_list! {
69  | |     /// Full list of type-safe syscalls.
70  | |     #[derive(Debug, Copy, Clone, Eq, PartialEq)]
71  | |     #[allow(missing_docs)]
...   |
494 | |     }
495 | | }
    | |_^
    = note: this error originates in the macro `syscall_list` (in Nightly builds, run with -Z macro-backtrace for more info)

error[E0308]: mismatched types
  --> detcore/src/syscalls/misc.rs:52:31
   |
52 |                 un.nodename = from_str(DEFAULT_HOSTNAME);
   |                 -----------   ^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `[u8; 65]`, found `[i8; 65]`
   |                 |
   |                 expected due to the type of this binding
   |
   = note: expected array `[u8; 65]`
              found array `[i8; 65]`

error[E0308]: mismatched types
  --> detcore/src/syscalls/misc.rs:53:33
   |
53 |                 un.domainname = from_str(DEFAULT_HOSTNAME.split('.').last().unwrap_or(""));
   |                 -------------   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `[u8; 65]`, found `[i8; 65]`
   |                 |
   |                 expected due to the type of this binding
   |
   = note: expected array `[u8; 65]`
              found array `[i8; 65]`

error[E0308]: mismatched types
  --> detcore/src/syscalls/misc.rs:56:26
   |
56 |             un.release = from_str("5.2.0");
   |             ----------   ^^^^^^^^^^^^^^^^^ expected `[u8; 65]`, found `[i8; 65]`
   |             |
   |             expected due to the type of this binding
   |
   = note: expected array `[u8; 65]`
              found array `[i8; 65]`

error[E0308]: mismatched types
  --> detcore/src/syscalls/misc.rs:57:26
   |
57 |             un.version = from_str(&format!("#1 SMP {}", epoch.format("%a %b %d %T %Z %Y")));
   |             ----------   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `[u8; 65]`, found `[i8; 65]`
   |             |
   |             expected due to the type of this binding
   |
   = note: expected array `[u8; 65]`
              found array `[i8; 65]`

   Compiling env_logger v0.8.4
   Compiling scroll v0.11.0
   Compiling tokio-util v0.7.10
warning: use of deprecated method `chrono::DateTime::<Tz>::timestamp_nanos`: use `timestamp_nanos_opt()` instead
   --> detcore/src/tool_global.rs:859:52
    |
859 |             LogicalTime::from_nanos(self.cfg.epoch.timestamp_nanos() as u64),
    |                                                    ^^^^^^^^^^^^^^^
    |
    = note: `#[warn(deprecated)]` on by default

warning: use of deprecated method `chrono::DateTime::<Tz>::timestamp_nanos`: use `timestamp_nanos_opt()` instead
   --> detcore/src/tool_global.rs:883:40
    |
883 |             LogicalTime::from_nanos(dt.timestamp_nanos() as u64)
    |                                        ^^^^^^^^^^^^^^^

warning: use of deprecated method `chrono::DateTime::<Tz>::timestamp_nanos`: use `timestamp_nanos_opt()` instead
   --> detcore/src/tool_global.rs:899:56
    |
899 |                 LogicalTime::from_nanos(self.cfg.epoch.timestamp_nanos() as u64),
    |                                                        ^^^^^^^^^^^^^^^

   Compiling plain v0.2.3
   Compiling goblin v0.5.4
Some errors have detailed explanations: E0308, E0407, E0412, E0432, E0599, E0609.
For more information about an error, try `rustc --explain E0308`.
warning: `detcore` (lib) generated 3 warnings
error: could not compile `detcore` (lib) due to 32 previous errors; 3 warnings emitted
warning: build failed, waiting for other jobs to finish...

Feature purpose and use cases I actually don't know how to build and use this repo. I'm currently trying to use it to see if I can make some Go race conditions we have in my app more reproducible.

VladimirMakaev commented 11 months ago

Hi @MichaelSnowden. The CI on the project has been running successfully so you might check the setup there for github actions. To build it and run you need x86_64 Linux machine. It won't work on WSL. (VMs might work but I'm not sure, it depends)

We're not actively developing hermit at the moment but you might get success with your use case as this is something we've been testing.

MichaelSnowden commented 11 months ago

Thatnks for the pointers. I was looking at that, but it's difficult because GHA's ubuntu-latest image isn't a Docker image. However, act has some Docker images which are pretty close to the GHA ones. Based on that, I came up with this Dockerfile, which builds successfully for me. However, there are quite a few warnings, and cargo test is failing.

# Use the closest thing to the GHA Ubuntu image
FROM catthehacker/ubuntu:act-latest

# Set the working directory (optional, for clarity and organization)
WORKDIR /workspace

# Install dependencies
RUN apt-get update && apt-get install -y \
        build-essential \
        curl \
        libunwind-dev \
    # Clean up to reduce image size
    && rm -rf /var/lib/apt/lists/*

# Install Rust
RUN curl https://sh.rustup.rs -sSf | bash -s -- -y

# Set the environment variable so that cargo is in the PATH
ENV PATH="/root/.cargo/bin:${PATH}"

# Clone the repository
RUN git clone https://github.com/facebookexperimental/hermit

# Change to the repository directory
WORKDIR /workspace/hermit

# Build the project
RUN cargo update \
    && cargo build

# Set the default command to execute
ENTRYPOINT ["/bin/bash"]

I build and run it with --platform linux/amd64.

However, I do get some test errors:

   Compiling hermetic_infra_hermit_flaky-tests v0.0.0 (/workspace/hermit/flaky-tests)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
    Finished test [unoptimized + debuginfo] target(s) in 1m 50s
     Running unittests src/lib.rs (target/debug/deps/detcore-0b67f0e05996fff3)

running 43 tests
test cpuid::tests::cpuid_leaf_count ... ok
test detlog::tests::test_detlog ... ok
test dirents::test::dents_can_deserialize_serialize ... ok
test dirents::test::dents64_can_deserialize_serialize ... ok
test dirents::test::dents64_can_serialize_sort_deserialize ... ok
test dirents::test::dents_can_serialize_sort_deserialize ... ok
test ivar::tests::test_ivar_simple1 ... ok
test ivar::tests::test_ivar_concurrent_put_get2 ... ok
test ivar::tests::test_ivar_concurrent_put_get1 ... ok
test ivar::tests::test_ivar_multi_put - should panic ... ok
test logdiff::test::test_compare_with_no_color ... ok
test logdiff::test::test_compare_with_color ... ok
test logdiff::test::test_filter_infos ... ok
test logdiff::test::test_filter_deterministic_with_filter ... ok
test logdiff::test::test_filter_deterministic ... ok
test logdiff::test::test_extract_log_messages ... ok
test mvar::tests::test_mvar_as_channel ... ok
test mvar::tests::test_mvar_as_channel_concurrent_readers ... ok
test logdiff::test::test_strip_log ... ok
test mvar::tests::test_mvar_as_channel_spsc ... ok
test mvar::tests::test_mvar_concurrent_put_get1 ... ok
test mvar::tests::test_mvar_concurrent_put_get2 ... ok
test mvar::tests::test_mvar_as_channel_try_spsc ... ok
test mvar::tests::test_mvar_simple1 ... ok
test preemptions::tests::normalize_preemption_record ... ok
test preemptions::tests::print_preemptionrecord ... ok
test preemptions::tests::round_trip_vec_representations ... ok
test preemptions::tests::with_latest_preempt_removed::removes_entire_history_for_last_tid_if_no_non_default_priority_changes ... ok
test preemptions::tests::test_split_map ... ok
test preemptions::tests::with_latest_preempt_removed::removes_latest_priority_change_and_coalesces_into_final_priority ... ok
test preemptions::tests::with_latest_preempt_removed::removes_only_priority_change_and_coalesces_into_final_priority ... ok
test scheduler::replayer::tests::test_context_switch_pre_hook ... ok
test scheduler::replayer::tests::test_context_switch_post_hook ... ok
test scheduler::replayer::tests::test_continue_ ... ok
test scheduler::replayer::tests::test_respect_branch_context_switch ... ok
test scheduler::replayer::tests::test_respect_branch_count ... ok
test scheduler::replayer::tests::test_fast_forward ... ok
test scheduler::test::test_my_thread_group2 ... ok
test scheduler::test::test_my_thread_group1 ... ok
test syscalls::files::test::linux_flags_assumptions ... ok
test logdiff::test::test_log_diff_compares_detlog ... ok
test logdiff::test::test_log_diff_with_color ... ok
test logdiff::test::test_log_diff_syscalls ... ok

test result: ok. 43 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.64s

     Running unittests scripts/syscaller.rs (target/debug/deps/syscaller-0be6ad9abf4ca025)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running tests/misc/mod.rs (target/debug/deps/tests_misc-25551cd143127094)

running 3 tests
test has_rdrand_without_detcore ... FAILED
2023-11-11T02:22:30.337825Z  INFO detcore::scheduler::runqueue: DETLOG SCHEDRAND: seeding scheduler runqueue with seed 0
2023-11-11T02:22:30.338097Z  INFO detcore::scheduler::runqueue: DETLOG SCHEDRAND: seeding scheduler runqueue with seed 0
2023-11-11T02:22:30.662566Z  INFO detcore::tool_global: detcore shut down, destroying global state
test rdrand_rdseed_is_masked ... FAILED
2023-11-11T02:22:30.768979Z  INFO detcore::tool_global: detcore shut down, destroying global state
test getrandom_intercepted ... FAILED

failures:

---- has_rdrand_without_detcore stdout ----
thread 'has_rdrand_without_detcore' panicked at detcore/tests/misc/mod.rs:60:9:
assertion failed: feature_ext.has_rdseed()
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

---- rdrand_rdseed_is_masked stdout ----
Expecting determinism:
Test Run 1:
thread 'rdrand_rdseed_is_masked' panicked at /root/.cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/safeptrace/src/lib.rs:317:22:
InvalidState(Wait(Exited(Pid(2469), Exited(0))))

---- getrandom_intercepted stdout ----
Expecting determinism:
Test Run 1:
thread 'getrandom_intercepted' panicked at /root/.cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/safeptrace/src/lib.rs:317:22:
InvalidState(Wait(Exited(Pid(2471), Exited(0))))

failures:
    getrandom_intercepted
    has_rdrand_without_detcore
    rdrand_rdseed_is_masked

test result: FAILED. 0 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.11s

error: test failed, to rerun pass `-p detcore --test tests_misc`
MichaelSnowden commented 11 months ago

I installed Go on the above Docker image and ran it on a hello world script, but it doesn't seem to be working:

root@fc53f076289f:/workspace/hermit# cat main.go 
package main

func main() {
        println("Hello")
}
root@fc53f076289f:/workspace/hermit# go version
go version go1.18.1 linux/amd64
root@fc53f076289f:/workspace/hermit# cargo run --bin hermit run go run main.go
warning: virtual workspace defaulting to `resolver = "1"` despite one or more workspace members being on edition 2021 which implies `resolver = "2"`
note: to keep the current resolver, specify `workspace.resolver = "1"` in the workspace root's manifest
note: to use the edition 2021 resolver, specify `workspace.resolver = "2"` in the workspace root's manifest
note: for more details see https://doc.rust-lang.org/cargo/reference/resolver.html#resolver-versions
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
warning: use of deprecated method `chrono::DateTime::<Tz>::timestamp_nanos`: use `timestamp_nanos_opt()` instead
   --> detcore/src/tool_global.rs:859:52
    |
859 |             LogicalTime::from_nanos(self.cfg.epoch.timestamp_nanos() as u64),
    |                                                    ^^^^^^^^^^^^^^^
    |
    = note: `#[warn(deprecated)]` on by default

warning: use of deprecated method `chrono::DateTime::<Tz>::timestamp_nanos`: use `timestamp_nanos_opt()` instead
   --> detcore/src/tool_global.rs:883:40
    |
883 |             LogicalTime::from_nanos(dt.timestamp_nanos() as u64)
    |                                        ^^^^^^^^^^^^^^^

warning: use of deprecated method `chrono::DateTime::<Tz>::timestamp_nanos`: use `timestamp_nanos_opt()` instead
   --> detcore/src/tool_global.rs:899:56
    |
899 |                 LogicalTime::from_nanos(self.cfg.epoch.timestamp_nanos() as u64),
    |                                                        ^^^^^^^^^^^^^^^

warning: use of deprecated method `chrono::DateTime::<Tz>::timestamp_nanos`: use `timestamp_nanos_opt()` instead
   --> detcore/src/tool_global.rs:293:67
    |
293 |             let epoch_ns = LogicalTime::from_nanos(self.cfg.epoch.timestamp_nanos() as u64);
    |                                                                   ^^^^^^^^^^^^^^^

warning: `detcore` (lib) generated 4 warnings
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
<jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
<jemalloc>: (This is the expected behaviour if you are running under QEMU)
warning: unused import: `types::Report`
  --> hermit-cli/src/bin/hermit/analyze/mod.rs:18:9
   |
18 | pub use types::Report;
   |         ^^^^^^^^^^^^^
   |
   = note: `#[warn(unused_imports)]` on by default

warning: `hermit` (bin "hermit") generated 1 warning (run `cargo fix --bin "hermit"` to apply 1 suggestion)
    Finished dev [unoptimized + debuginfo] target(s) in 0.85s
     Running `target/debug/hermit run go run main.go`
thread 'main' panicked at /root/.cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-ptrace/src/perf.rs:532:19:
Unexpected error during perf feature check: -38 ENOSYS (Invalid system call number)
stack backtrace:
   0:       0x40016e855c - std::backtrace_rs::backtrace::libunwind::trace::h206c2e1d04e474d4
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/../../backtrace/src/backtrace/libunwind.rs:104:5
   1:       0x40016e855c - std::backtrace_rs::backtrace::trace_unsynchronized::hc91330a2f9cb0edd
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:       0x40016e855c - std::sys_common::backtrace::_print_fmt::hf8a6e54358fb19c2
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sys_common/backtrace.rs:67:5
   3:       0x40016e855c - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h08d26c1388c2b6a3
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sys_common/backtrace.rs:44:22
   4:       0x4001716af0 - core::fmt::rt::Argument::fmt::h6268e01944893dd0
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/core/src/fmt/rt.rs:142:9
   5:       0x4001716af0 - core::fmt::write::h1e713169a270f87f
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/core/src/fmt/mod.rs:1120:17
   6:       0x40016e574f - std::io::Write::write_fmt::he8c1854af06dcd8b
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/io/mod.rs:1762:15
   7:       0x40016e8344 - std::sys_common::backtrace::_print::h876a12bb8bba31bc
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sys_common/backtrace.rs:47:5
   8:       0x40016e8344 - std::sys_common::backtrace::print::haedd53d9d4f81818
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sys_common/backtrace.rs:34:9
   9:       0x40016e9947 - std::panicking::default_hook::{{closure}}::h493d2159d3a9f9d3
  10:       0x40016e96af - std::panicking::default_hook::h41ff4235acc4826e
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panicking.rs:292:9
  11:       0x40016e9dc8 - std::panicking::rust_panic_with_hook::ha89d3c5444f60fc1
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panicking.rs:779:13
  12:       0x40016e9cae - std::panicking::begin_panic_handler::{{closure}}::hf9042243d7e46e84
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panicking.rs:657:13
  13:       0x40016e8a26 - std::sys_common::backtrace::__rust_end_short_backtrace::h59fbef882d171ed7
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sys_common/backtrace.rs:170:18
  14:       0x40016e9a12 - rust_begin_unwind
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panicking.rs:645:5
  15:       0x40001e8a95 - core::panicking::panic_fmt::ha4da013019e6a486
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/core/src/panicking.rs:72:14
  16:       0x4000969929 - reverie_ptrace::perf::test_perf_pmu_support::h0dad8500265a4bd8
                               at /root/.cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-ptrace/src/perf.rs:532:19
  17:       0x400096b8a6 - <reverie_ptrace::perf::IS_PERF_SUPPORTED as core::ops::deref::Deref>::deref::__static_ref_initialize::hca39f1a4497e5521
                               at /root/.cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-ptrace/src/perf.rs:538:42
  18:       0x400096b8a6 - core::ops::function::FnOnce::call_once::ha121322390aed6e4
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/core/src/ops/function.rs:250:5
  19:       0x400094fb5f - lazy_static::lazy::Lazy<T>::get::{{closure}}::h497f7a42f717fc46
                               at /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/lazy_static-1.4.0/src/inline_lazy.rs:31:29
  20:       0x4000934a87 - std::sync::once::Once::call_once::{{closure}}::h80b2512c816d6f28
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sync/once.rs:149:41
  21:       0x4000971bb1 - std::sys_common::once::futex::Once::call::h69060700763dd713
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sys_common/once/futex.rs:124:21
  22:       0x40009347bf - std::sync::once::Once::call_once::h3dc8c297df76ed66
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sync/once.rs:149:9
  23:       0x400096b3a6 - lazy_static::lazy::Lazy<T>::get::he6223a9f56771bac
                               at /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/lazy_static-1.4.0/src/inline_lazy.rs:30:9
  24:       0x400096b3a6 - <reverie_ptrace::perf::IS_PERF_SUPPORTED as core::ops::deref::Deref>::deref::__stability::h6f6ce42e7dd2022d
                               at /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/lazy_static-1.4.0/src/lib.rs:142:21
  25:       0x400096b3a6 - <reverie_ptrace::perf::IS_PERF_SUPPORTED as core::ops::deref::Deref>::deref::h7facecbd45c16660
                               at /root/.cargo/registry/src/index.crates.io-6f17d22bba15001f/lazy_static-1.4.0/src/lib.rs:144:17
  26:       0x400096a68e - reverie_ptrace::perf::is_perf_supported::h7035150dbd0dbbd8
                               at /root/.cargo/git/checkouts/reverie-9a587e40a0d7d3be/dd1490f/reverie-ptrace/src/perf.rs:544:5
  27:       0x40002f4a84 - hermit::run::RunOpts::validate_args::h610aeb3e954ae2ac
                               at /workspace/hermit/hermit-cli/src/bin/hermit/run.rs:558:52
  28:       0x40002f4868 - hermit::run::RunOpts::main::h4d271d12298cc03a
                               at /workspace/hermit/hermit-cli/src/bin/hermit/run.rs:518:9
  29:       0x40002d683d - hermit::Subcommand::main::hea1198d4c76f3ab7
                               at /workspace/hermit/hermit-cli/src/bin/hermit/main.rs:82:35
  30:       0x40002d84bf - hermit::main::h60d43cd6065498a6
                               at /workspace/hermit/hermit-cli/src/bin/hermit/main.rs:98:5
  31:       0x400028717b - core::ops::function::FnOnce::call_once::h127f17e563adbaf3
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/core/src/ops/function.rs:250:5
  32:       0x40002cbe1e - std::sys_common::backtrace::__rust_begin_short_backtrace::hfcc2d214824d9129
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/sys_common/backtrace.rs:154:18
  33:       0x4000230f71 - std::rt::lang_start::{{closure}}::hf4a77cc60f32bab5
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/rt.rs:167:18
  34:       0x40016deb07 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h76fbd0d643b236b8
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/core/src/ops/function.rs:284:13
  35:       0x40016deb07 - std::panicking::try::do_call::h3f074eb441dc2e73
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panicking.rs:552:40
  36:       0x40016deb07 - std::panicking::try::hf6ee24bcb846028c
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panicking.rs:516:19
  37:       0x40016deb07 - std::panic::catch_unwind::h1e400aad52315802
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panic.rs:142:14
  38:       0x40016deb07 - std::rt::lang_start_internal::{{closure}}::h8a0df2fc86ce15e9
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/rt.rs:148:48
  39:       0x40016deb07 - std::panicking::try::do_call::ha795027ae0e07650
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panicking.rs:552:40
  40:       0x40016deb07 - std::panicking::try::hfd92e957f86dfff0
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panicking.rs:516:19
  41:       0x40016deb07 - std::panic::catch_unwind::hd9362754ce98d7d7
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/panic.rs:142:14
  42:       0x40016deb07 - std::rt::lang_start_internal::h3cc6e598a17e32c8
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/rt.rs:148:20
  43:       0x4000230f4a - std::rt::lang_start::h50d89f00f21c72f0
                               at /rustc/edf0b1db0a7f29d71ee82cfc53bdc170fe74e501/library/std/src/rt.rs:166:17
  44:       0x40002d85ae - main
  45:       0x40036a4d90 - <unknown>
  46:       0x40036a4e40 - __libc_start_main
  47:       0x40001e93c5 - _start
root@fc53f076289f:/workspace/hermit# 
VladimirMakaev commented 11 months ago

@MichaelSnowden we never tested this in Docker and it might not work at all since Hermit is somewhat of Docker itself. I ran cargo test using nightly compiler on our Linux server that we use for development and didn't observe errors you saw and it succeeded. Before open sourcing this I remember installing latest stable Ubuntu on a Lenovo laptop and it worked there as well.

The errors also indicate that you might be running it in x86 emulator, this might not work since hermit relies on certain hardware features. The best way to get started is to run it on pure x86 Linux machine without any virtualization/containerisation going on. You might get success with a virtual machine too but there are more factors that can affect it.

As I mentioned we're not actively developing hermit anymore but we run all e2e tests in our CI system so you might get something useful out of this repo. You can find those tests under "tests" directory with Buck based setup (which we haven't gotten to get working in OSS repo, but you can get the idea what they do)

MichaelSnowden commented 11 months ago

Gotcha, I'll try running without Docker. Thanks!