Refactor LibOS to conform with logging strategy

This commit introduces a unified logging strategy, summarized as below:

1. Use `error!` to mark errors or unexpected conditions, e.g., a
 `Result::Err` returned from a system call.
2. Use `warn!` to warn about potentially problematic issues, e.g.,
 executing a workaround or fake implementation.
3. Use `info!` to show important events (from users' perspective) in
 normal execution, e.g., creating/exiting a process/thread.
4. Use `debug!` to track major events in normal execution, e.g., the
 high-level arguments of a system call.
5. Use `trace!` to record the most detailed info, e.g., when a system
 call enters and exits the LibOS.
This commit is contained in:
Tate, Hongliang Tian 2020-03-24 15:00:32 +00:00
parent 9713e74ed9
commit 5933499f9b
34 changed files with 94 additions and 73 deletions

@ -33,7 +33,7 @@ pub fn do_faccessat(
mode: AccessibilityCheckMode,
flags: AccessibilityCheckFlags,
) -> Result<()> {
info!(
debug!(
"faccessat: dirfd: {:?}, path: {:?}, mode: {:?}, flags: {:?}",
dirfd, path, mode, flags
);
@ -45,7 +45,7 @@ pub fn do_faccessat(
}
pub fn do_access(path: &str, mode: AccessibilityCheckMode) -> Result<()> {
info!("access: path: {:?}, mode: {:?}", path, mode);
debug!("access: path: {:?}, mode: {:?}", path, mode);
let current_ref = process::get_current();
let mut current = current_ref.lock().unwrap();
let inode = current.lookup_inode(path)?;

@ -3,7 +3,7 @@ use super::*;
pub fn do_chdir(path: &str) -> Result<()> {
let current_ref = process::get_current();
let mut current_process = current_ref.lock().unwrap();
info!("chdir: path: {:?}", path);
debug!("chdir: path: {:?}", path);
let inode = current_process.lookup_inode(path)?;
let info = inode.metadata()?;

@ -1,7 +1,7 @@
use super::*;
pub fn do_close(fd: FileDesc) -> Result<()> {
info!("close: fd: {}", fd);
debug!("close: fd: {}", fd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_table_ref = current_process.get_files();

@ -61,7 +61,7 @@ unsafe fn write_cstr(ptr: *mut u8, s: &str) {
}
pub fn do_getdents64(fd: FileDesc, buf: &mut [u8]) -> Result<usize> {
info!(
debug!(
"getdents64: fd: {}, buf: {:?}, buf_size: {}",
fd,
buf.as_ptr(),

@ -52,7 +52,7 @@ impl<'a> FcntlCmd<'a> {
}
pub fn do_fcntl(fd: FileDesc, cmd: &mut FcntlCmd) -> Result<isize> {
info!("fcntl: fd: {:?}, cmd: {:?}", &fd, cmd);
debug!("fcntl: fd: {:?}, cmd: {:?}", &fd, cmd);
let current_ref = process::get_current();
let mut current = current_ref.lock().unwrap();
let file_table_ref = current.get_files();

@ -1,7 +1,7 @@
use super::*;
pub fn do_fsync(fd: FileDesc) -> Result<()> {
info!("fsync: fd: {}", fd);
debug!("fsync: fd: {}", fd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;
@ -10,7 +10,7 @@ pub fn do_fsync(fd: FileDesc) -> Result<()> {
}
pub fn do_fdatasync(fd: FileDesc) -> Result<()> {
info!("fdatasync: fd: {}", fd);
debug!("fdatasync: fd: {}", fd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;

@ -65,7 +65,7 @@ impl<'a> IoctlCmd<'a> {
}
pub fn do_ioctl(fd: FileDesc, cmd: &mut IoctlCmd) -> Result<()> {
info!("ioctl: fd: {}, cmd: {:?}", fd, cmd);
debug!("ioctl: fd: {}, cmd: {:?}", fd, cmd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;

@ -3,7 +3,7 @@ use super::*;
pub fn do_link(oldpath: &str, newpath: &str) -> Result<()> {
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
info!("link: oldpath: {:?}, newpath: {:?}", oldpath, newpath);
debug!("link: oldpath: {:?}, newpath: {:?}", oldpath, newpath);
let (new_dir_path, new_file_name) = split_path(&newpath);
let inode = current_process.lookup_inode(&oldpath)?;

@ -4,7 +4,7 @@ pub fn do_mkdir(path: &str, mode: usize) -> Result<()> {
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
// TODO: check pathname
info!("mkdir: path: {:?}, mode: {:#o}", path, mode);
debug!("mkdir: path: {:?}, mode: {:#o}", path, mode);
let (dir_path, file_name) = split_path(&path);
let inode = current_process.lookup_inode(dir_path)?;

@ -18,7 +18,7 @@ fn do_open(path: &str, flags: u32, mode: u32) -> Result<FileDesc> {
}
pub fn do_openat(dirfd: DirFd, path: &str, flags: u32, mode: u32) -> Result<FileDesc> {
info!(
debug!(
"openat: dirfd: {:?}, path: {:?}, flags: {:#o}, mode: {:#o}",
dirfd, path, flags, mode
);

@ -1,7 +1,7 @@
use super::*;
pub fn do_read(fd: FileDesc, buf: &mut [u8]) -> Result<usize> {
info!("read: fd: {}", fd);
debug!("read: fd: {}", fd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;
@ -9,7 +9,7 @@ pub fn do_read(fd: FileDesc, buf: &mut [u8]) -> Result<usize> {
}
pub fn do_readv(fd: FileDesc, bufs: &mut [&mut [u8]]) -> Result<usize> {
info!("readv: fd: {}", fd);
debug!("readv: fd: {}", fd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;
@ -17,7 +17,7 @@ pub fn do_readv(fd: FileDesc, bufs: &mut [&mut [u8]]) -> Result<usize> {
}
pub fn do_pread(fd: FileDesc, buf: &mut [u8], offset: usize) -> Result<usize> {
info!("pread: fd: {}, offset: {}", fd, offset);
debug!("pread: fd: {}, offset: {}", fd, offset);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;

@ -3,7 +3,7 @@ use super::*;
pub fn do_rename(oldpath: &str, newpath: &str) -> Result<()> {
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
info!("rename: oldpath: {:?}, newpath: {:?}", oldpath, newpath);
debug!("rename: oldpath: {:?}, newpath: {:?}", oldpath, newpath);
let (old_dir_path, old_file_name) = split_path(&oldpath);
let (new_dir_path, new_file_name) = split_path(&newpath);

@ -3,7 +3,7 @@ use super::*;
pub fn do_rmdir(path: &str) -> Result<()> {
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
info!("rmdir: path: {:?}", path);
debug!("rmdir: path: {:?}", path);
let (dir_path, file_name) = split_path(&path);
let dir_inode = current_process.lookup_inode(dir_path)?;

@ -7,7 +7,7 @@ pub fn do_sendfile(
count: usize,
) -> Result<(usize, usize)> {
// (len, offset)
info!(
debug!(
"sendfile: out: {}, in: {}, offset: {:?}, count: {}",
out_fd, in_fd, offset, count
);

@ -140,7 +140,7 @@ fn do_stat(path: &str) -> Result<Stat> {
}
pub fn do_fstat(fd: u32) -> Result<Stat> {
info!("fstat: fd: {}", fd);
debug!("fstat: fd: {}", fd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;
@ -150,7 +150,7 @@ pub fn do_fstat(fd: u32) -> Result<Stat> {
}
pub fn do_lstat(path: &str) -> Result<Stat> {
info!("lstat: path: {}", path);
debug!("lstat: path: {}", path);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let inode = current_process.lookup_inode(&path)?;
@ -159,7 +159,7 @@ pub fn do_lstat(path: &str) -> Result<Stat> {
}
pub fn do_fstatat(dirfd: DirFd, path: &str, flags: StatFlags) -> Result<Stat> {
info!(
debug!(
"fstatat: dirfd: {:?}, path: {:?}, flags: {:?}",
dirfd, path, flags
);

@ -1,7 +1,7 @@
use super::*;
pub fn do_readlink(path: &str, buf: &mut [u8]) -> Result<usize> {
info!("readlink: path: {:?}", path);
debug!("readlink: path: {:?}", path);
let file_path = {
if path == "/proc/self/exe" {
let current_ref = process::get_current();

@ -1,7 +1,7 @@
use super::*;
pub fn do_truncate(path: &str, len: usize) -> Result<()> {
info!("truncate: path: {:?}, len: {}", path, len);
debug!("truncate: path: {:?}, len: {}", path, len);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
current_process.lookup_inode(&path)?.resize(len)?;
@ -9,7 +9,7 @@ pub fn do_truncate(path: &str, len: usize) -> Result<()> {
}
pub fn do_ftruncate(fd: FileDesc, len: usize) -> Result<()> {
info!("ftruncate: fd: {}, len: {}", fd, len);
debug!("ftruncate: fd: {}, len: {}", fd, len);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;

@ -3,7 +3,7 @@ use super::*;
pub fn do_unlink(path: &str) -> Result<()> {
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
info!("unlink: path: {:?}", path);
debug!("unlink: path: {:?}", path);
let (dir_path, file_name) = split_path(&path);
let dir_inode = current_process.lookup_inode(dir_path)?;

@ -1,7 +1,7 @@
use super::*;
pub fn do_write(fd: FileDesc, buf: &[u8]) -> Result<usize> {
info!("write: fd: {}", fd);
debug!("write: fd: {}", fd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;
@ -9,7 +9,7 @@ pub fn do_write(fd: FileDesc, buf: &[u8]) -> Result<usize> {
}
pub fn do_writev(fd: FileDesc, bufs: &[&[u8]]) -> Result<usize> {
info!("writev: fd: {}", fd);
debug!("writev: fd: {}", fd);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;
@ -17,7 +17,7 @@ pub fn do_writev(fd: FileDesc, bufs: &[&[u8]]) -> Result<usize> {
}
pub fn do_pwrite(fd: FileDesc, buf: &[u8], offset: usize) -> Result<usize> {
info!("pwrite: fd: {}, offset: {}", fd, offset);
debug!("pwrite: fd: {}, offset: {}", fd, offset);
let current_ref = process::get_current();
let current_process = current_ref.lock().unwrap();
let file_ref = current_process.get_files().lock().unwrap().get(fd)?;

@ -1,7 +1,7 @@
use super::*;
pub fn do_sync() -> Result<()> {
info!("sync:");
debug!("sync:");
ROOT_INODE.fs().sync()?;
Ok(())
}

@ -156,17 +156,19 @@ unsafe impl Send for PipeWriter {}
unsafe impl Sync for PipeWriter {}
pub fn do_pipe2(flags: u32) -> Result<[FileDesc; 2]> {
info!("pipe2: flags: {:#x}", flags);
let creation_flags = CreationFlags::from_bits_truncate(flags);
let status_flags = StatusFlags::from_bits_truncate(flags);
debug!("pipe2: flags: {:?} {:?}", creation_flags, status_flags);
let current_ref = process::get_current();
let current = current_ref.lock().unwrap();
let pipe = Pipe::new(StatusFlags::from_bits_truncate(flags))?;
let pipe = Pipe::new(status_flags)?;
let file_table_ref = current.get_files();
let mut file_table = file_table_ref.lock().unwrap();
let close_on_spawn = creation_flags.must_close_on_spawn();
let reader_fd = file_table.put(Arc::new(Box::new(pipe.reader)), close_on_spawn);
let writer_fd = file_table.put(Arc::new(Box::new(pipe.writer)), close_on_spawn);
info!("pipe2: reader_fd: {}, writer_fd: {}", reader_fd, writer_fd);
trace!("pipe2: reader_fd: {}, writer_fd: {}", reader_fd, writer_fd);
Ok([reader_fd, writer_fd])
}

@ -400,7 +400,6 @@ pub fn do_fcntl(fd: FileDesc, cmd: u32, arg: u64) -> Result<isize> {
}
pub fn do_ioctl(fd: FileDesc, cmd: u32, argp: *mut u8) -> Result<isize> {
info!("ioctl: fd: {}, cmd: {}, argp: {:?}", fd, cmd, argp);
let mut ioctl_cmd = unsafe {
if argp.is_null() == false {
from_user::check_mut_ptr(argp)?;

@ -15,7 +15,7 @@ pub fn do_select(
exceptfds: &mut libc::fd_set,
timeout: Option<libc::timeval>,
) -> Result<usize> {
info!("select: nfds: {}", nfds);
debug!("select: nfds: {}", nfds);
// convert libos fd to Linux fd
let mut host_to_libos_fd = [0; libc::FD_SETSIZE];
let mut polls = Vec::<libc::pollfd>::new();
@ -117,7 +117,7 @@ pub fn do_select(
}
pub fn do_poll(pollfds: &mut [libc::pollfd], timeout: c_int) -> Result<usize> {
info!(
debug!(
"poll: {:?}, timeout: {}",
pollfds.iter().map(|p| p.fd).collect::<Vec<_>>(),
timeout
@ -189,7 +189,7 @@ pub fn do_poll(pollfds: &mut [libc::pollfd], timeout: c_int) -> Result<usize> {
}
pub fn do_epoll_create1(flags: c_int) -> Result<FileDesc> {
info!("epoll_create1: flags: {}", flags);
debug!("epoll_create1: flags: {}", flags);
let epoll = EpollFile::new()?;
let file_ref: Arc<Box<dyn File>> = Arc::new(Box::new(epoll));
@ -211,7 +211,7 @@ pub fn do_epoll_ctl(
fd: FileDesc,
event: *const libc::epoll_event,
) -> Result<()> {
info!("epoll_ctl: epfd: {}, op: {:?}, fd: {}", epfd, op, fd);
debug!("epoll_ctl: epfd: {}, op: {:?}, fd: {}", epfd, op, fd);
let current_ref = process::get_current();
let mut proc = current_ref.lock().unwrap();
@ -240,7 +240,7 @@ pub fn do_epoll_wait(
events: &mut [libc::epoll_event],
timeout: c_int,
) -> Result<usize> {
info!(
debug!(
"epoll_wait: epfd: {}, len: {:?}, timeout: {}",
epfd,
events.len(),

@ -6,7 +6,7 @@ use process::Process;
use util::mem_util::from_user;
pub fn do_sendmsg(fd: c_int, msg_ptr: *const msghdr, flags_c: c_int) -> Result<isize> {
info!(
debug!(
"sendmsg: fd: {}, msg: {:?}, flags: 0x{:x}",
fd, msg_ptr, flags_c
);
@ -36,7 +36,7 @@ pub fn do_sendmsg(fd: c_int, msg_ptr: *const msghdr, flags_c: c_int) -> Result<i
}
pub fn do_recvmsg(fd: c_int, msg_mut_ptr: *mut msghdr_mut, flags_c: c_int) -> Result<isize> {
info!(
debug!(
"recvmsg: fd: {}, msg: {:?}, flags: 0x{:x}",
fd, msg_mut_ptr, flags_c
);
@ -232,11 +232,8 @@ pub fn do_epoll_pwait(
timeout: c_int,
sigmask: *const usize, //TODO:add sigset_t
) -> Result<isize> {
if sigmask.is_null() {
info!("epoll_wait");
} else {
info!("epoll_pwait")
if !sigmask.is_null() {
warn!("epoll_pwait cannot handle signal mask, yet");
}
//TODO:add signal support
do_epoll_wait(epfd, events, maxevents, timeout)
}

@ -14,7 +14,7 @@ pub use std::sync::{
macro_rules! debug_trace {
() => {
println!("> Line = {}, File = {}", line!(), file!())
debug!("> Line = {}, File = {}", line!(), file!())
};
}

@ -22,7 +22,7 @@ impl ArchPrctlCode {
}
pub fn do_arch_prctl(code: ArchPrctlCode, addr: *mut usize) -> Result<()> {
info!(
debug!(
"do_arch_prctl: code: {:?}, addr: {:#o}",
code, addr as usize
);

@ -19,7 +19,7 @@ pub fn do_init<'a, 'b>(
fn reloc_symbols(process_base_addr: usize, elf_file: &ElfFile) -> Result<()> {
let rela_entries = elf_helper::get_rela_entries(elf_file, ".rela.dyn")?;
for rela_entry in rela_entries {
println!(
trace!(
"\toffset: {:#X}, symbol index: {}, type: {}, addend: {:#X}",
rela_entry.get_offset(),
rela_entry.get_symbol_table_index(),

@ -116,6 +116,7 @@ fn new_process(
parent_adopts_new_child(&parent_ref, &new_process_ref);
process_table::put(new_pid, new_process_ref.clone());
let new_tid = new_pid;
info!("Process created: elf = {}, tid = {}", elf_path, new_tid);
Ok((new_tid, new_process_ref))
}

@ -123,6 +123,8 @@ pub fn run_task(libos_tid: pid_t, host_tid: pid_t) -> Result<i32> {
(process.get_exit_status(), parent.get_tid())
};
info!("Thread exited: tid = {}", libos_tid);
// If process's parent is the IDLE_PROCESS (pid = 0), so it has to release itself
if parent_pid == 0 {
process_table::remove(pid);

@ -42,7 +42,7 @@ pub fn do_clone(
ctid: Option<*mut pid_t>,
new_tls: Option<usize>,
) -> Result<pid_t> {
info!(
debug!(
"clone: flags: {:?}, stack_addr: {:?}, ptid: {:?}, ctid: {:?}, new_tls: {:?}",
flags, user_rsp, ptid, ctid, new_tls
);
@ -99,6 +99,7 @@ pub fn do_clone(
}
process_table::put(new_thread_pid, new_thread_ref.clone());
info!("Thread created: tid = {}", new_thread_pid);
if let Some(ptid) = ptid {
unsafe {
@ -111,7 +112,7 @@ pub fn do_clone(
}
pub fn do_set_tid_address(tidptr: *mut pid_t) -> Result<pid_t> {
info!("set_tid_address: tidptr: {:#x}", tidptr as usize);
debug!("set_tid_address: tidptr: {:#x}", tidptr as usize);
let current_ref = get_current();
let mut current = current_ref.lock().unwrap();
current.clear_child_tid = Some(tidptr);

@ -703,7 +703,7 @@ fn do_spawn(
let envp = clone_cstrings_safely(envp)?;
let file_actions = clone_file_actions_safely(fdop_list)?;
let parent = process::get_current();
info!(
debug!(
"spawn: path: {:?}, argv: {:?}, envp: {:?}, fdop: {:?}",
path, argv, envp, file_actions
);
@ -947,7 +947,7 @@ fn do_nanosleep(req_u: *const timespec_t, rem_u: *mut timespec_t) -> Result<isiz
const MAP_FAILED: *const c_void = ((-1) as i64) as *const c_void;
fn do_exit(status: i32) -> ! {
info!("exit: {}", status);
debug!("exit: {}", status);
extern "C" {
fn do_exit_task() -> !;
}
@ -1028,7 +1028,7 @@ fn do_sched_setaffinity(pid: pid_t, cpusize: size_t, buf: *const c_uchar) -> Res
}
fn do_socket(domain: c_int, socket_type: c_int, protocol: c_int) -> Result<isize> {
info!(
debug!(
"socket: domain: {}, socket_type: 0x{:x}, protocol: {}",
domain, socket_type, protocol
);
@ -1052,7 +1052,7 @@ fn do_socket(domain: c_int, socket_type: c_int, protocol: c_int) -> Result<isize
}
fn do_connect(fd: c_int, addr: *const libc::sockaddr, addr_len: libc::socklen_t) -> Result<isize> {
info!(
debug!(
"connect: fd: {}, addr: {:?}, addr_len: {}",
fd, addr, addr_len
);
@ -1089,7 +1089,7 @@ fn do_accept4(
addr_len: *mut libc::socklen_t,
flags: c_int,
) -> Result<isize> {
info!(
debug!(
"accept4: fd: {}, addr: {:?}, addr_len: {:?}, flags: {:#x}",
fd, addr, addr_len, flags
);
@ -1119,7 +1119,7 @@ fn do_accept4(
}
fn do_shutdown(fd: c_int, how: c_int) -> Result<isize> {
info!("shutdown: fd: {}, how: {}", fd, how);
debug!("shutdown: fd: {}, how: {}", fd, how);
let current_ref = process::get_current();
let mut proc = current_ref.lock().unwrap();
let file_ref = proc.get_files().lock().unwrap().get(fd as FileDesc)?;
@ -1132,7 +1132,7 @@ fn do_shutdown(fd: c_int, how: c_int) -> Result<isize> {
}
fn do_bind(fd: c_int, addr: *const libc::sockaddr, addr_len: libc::socklen_t) -> Result<isize> {
info!("bind: fd: {}, addr: {:?}, addr_len: {}", fd, addr, addr_len);
debug!("bind: fd: {}, addr: {:?}, addr_len: {}", fd, addr, addr_len);
let current_ref = process::get_current();
let mut proc = current_ref.lock().unwrap();
let file_ref = proc.get_files().lock().unwrap().get(fd as FileDesc)?;
@ -1154,7 +1154,7 @@ fn do_bind(fd: c_int, addr: *const libc::sockaddr, addr_len: libc::socklen_t) ->
}
fn do_listen(fd: c_int, backlog: c_int) -> Result<isize> {
info!("listen: fd: {}, backlog: {}", fd, backlog);
debug!("listen: fd: {}, backlog: {}", fd, backlog);
let current_ref = process::get_current();
let mut proc = current_ref.lock().unwrap();
let file_ref = proc.get_files().lock().unwrap().get(fd as FileDesc)?;
@ -1176,7 +1176,7 @@ fn do_setsockopt(
optval: *const c_void,
optlen: libc::socklen_t,
) -> Result<isize> {
info!(
debug!(
"setsockopt: fd: {}, level: {}, optname: {}, optval: {:?}, optlen: {:?}",
fd, level, optname, optval, optlen
);
@ -1207,7 +1207,7 @@ fn do_getsockopt(
optval: *mut c_void,
optlen: *mut libc::socklen_t,
) -> Result<isize> {
info!(
debug!(
"getsockopt: fd: {}, level: {}, optname: {}, optval: {:?}, optlen: {:?}",
fd, level, optname, optval, optlen
);
@ -1231,7 +1231,7 @@ fn do_getpeername(
addr: *mut libc::sockaddr,
addr_len: *mut libc::socklen_t,
) -> Result<isize> {
info!(
debug!(
"getpeername: fd: {}, addr: {:?}, addr_len: {:?}",
fd, addr, addr_len
);
@ -1257,7 +1257,7 @@ fn do_getsockname(
addr: *mut libc::sockaddr,
addr_len: *mut libc::socklen_t,
) -> Result<isize> {
info!(
debug!(
"getsockname: fd: {}, addr: {:?}, addr_len: {:?}",
fd, addr, addr_len
);
@ -1283,7 +1283,7 @@ fn do_sendto(
addr: *const libc::sockaddr,
addr_len: libc::socklen_t,
) -> Result<isize> {
info!(
debug!(
"sendto: fd: {}, base: {:?}, len: {}, addr: {:?}, addr_len: {}",
fd, base, len, addr, addr_len
);
@ -1311,7 +1311,7 @@ fn do_recvfrom(
addr: *mut libc::sockaddr,
addr_len: *mut libc::socklen_t,
) -> Result<isize> {
info!(
debug!(
"recvfrom: fd: {}, base: {:?}, len: {}, flags: {}, addr: {:?}, addr_len: {:?}",
fd, base, len, flags, addr, addr_len
);
@ -1337,7 +1337,7 @@ fn do_socketpair(
protocol: c_int,
sv: *mut c_int,
) -> Result<isize> {
info!(
debug!(
"socketpair: domain: {}, type:0x{:x}, protocol: {}",
domain, socket_type, protocol
);
@ -1362,7 +1362,7 @@ fn do_socketpair(
.unwrap()
.put(Arc::new(Box::new(server_socket)), false);
info!("socketpair: ({}, {})", sock_pair[0], sock_pair[1]);
debug!("socketpair: ({}, {})", sock_pair[0], sock_pair[1]);
Ok(0)
} else if (domain == libc::AF_TIPC) {
return_errno!(EAFNOSUPPORT, "cluster domain sockets not supported")

@ -34,7 +34,6 @@ impl GlobalProfiler {
self.syscall_exit(SyscallNum::Exit, false);
let tid = process::do_gettid();
println!("thread {} exits", tid);
let mut exiting_profiler = self.inner.remove(&tid).ok_or_else(|| {
errno!(
@ -99,7 +98,6 @@ impl ThreadProfiler {
fn stop(&mut self) -> Result<()> {
if self.status != Status::Running {
error!("wrong status is {:?}", self.status);
return_errno!(EINVAL, "fail to stop thread profiler");
}
let real = time::do_gettimeofday().as_duration() - self.start_time.get_realtime().unwrap();

@ -1,4 +1,3 @@
use super::process;
/// Log infrastructure.
///
/// There are five APIs for producing log messages:
@ -9,6 +8,27 @@ use super::process;
/// 5. `trace!`
/// which corresponds to five different log levels.
///
/// To give all developers a common sense of "when to use which log level", we give some guidelines
/// and examples here:
///
/// 1. Use `errno!` to mark errors or unexpected conditions, e.g., a `Result::Err` returned from a
/// system call.
///
/// 2. Use `warn!` to warn about potentially problematic issues, e.g., executing a workaround or
/// fake implementation.
///
/// 3. Use `info!` to show important events (from users' perspective) in normal execution,
/// e.g., creating/exiting a process/thread.
///
/// 4. Use `debug!` to track major events in normal execution, e.g., the high-level
/// arguments of a system call.
///
/// 5. Use `trace` to record the most detailed info, e.g., when a system call enters
/// and exits the LibOS.
///
/// One of the most important principles for effective logging is "don't log too much or too little".
/// So log messages should be inserted with discretion.
///
/// Safety. Sensitive, internal info may be leaked though log messages. To prevent
/// this from happening, the current solution is to turn off the log entirely
/// when initializing the log infrastructure, if the enclave is in release mode.
@ -16,6 +36,7 @@ use super::process;
/// Note. Do not use log as a way to display critical info to users as log may be
/// turned off (even the error messages). For such messages, use `println!` or
/// `eprintln!` directly.
use super::process;
use log::*;
use std::cell::Cell;

@ -24,12 +24,12 @@ pub fn do_mmap(
offset: usize,
) -> Result<usize> {
if flags.contains(MMapFlags::MAP_ANONYMOUS) {
info!(
debug!(
"mmap: addr: {:#x}, size: {:#x}, perms: {:?}, flags: {:?}",
addr, size, perms, flags,
);
} else {
info!(
debug!(
"mmap: addr: {:#x}, size: {:#x}, perms: {:?}, flags: {:?}, fd: {:?}, offset: {:?}",
addr, size, perms, flags, fd, offset
);
@ -45,7 +45,7 @@ pub fn do_mmap(
}
pub fn do_munmap(addr: usize, size: usize) -> Result<()> {
info!("munmap: addr: {:#x}, size: {:#x}", addr, size);
debug!("munmap: addr: {:#x}, size: {:#x}", addr, size);
let mut current_vm_ref = {
let current_ref = get_current();
let current_process = current_ref.lock().unwrap();
@ -56,7 +56,7 @@ pub fn do_munmap(addr: usize, size: usize) -> Result<()> {
}
pub fn do_brk(addr: usize) -> Result<usize> {
info!("brk: addr: {:#x}", addr);
debug!("brk: addr: {:#x}", addr);
let current_ref = get_current();
let current_process = current_ref.lock().unwrap();
let current_vm_ref = current_process.get_vm();