Skip to content

Commit 7c10f21

Browse files
authored
Add logger to kani-driver (rust-lang#1900)
1 parent 0b994e3 commit 7c10f21

File tree

5 files changed

+53
-2
lines changed

5 files changed

+53
-2
lines changed

Cargo.lock

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ name = "kani-driver"
467467
version = "0.14.1"
468468
dependencies = [
469469
"anyhow",
470+
"atty",
470471
"cargo_metadata",
471472
"clap 2.34.0",
472473
"comfy-table",
@@ -482,6 +483,9 @@ dependencies = [
482483
"serde_json",
483484
"structopt",
484485
"toml",
486+
"tracing",
487+
"tracing-subscriber",
488+
"tracing-tree",
485489
]
486490

487491
[[package]]

docs/src/cheat-sheets.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ These can help understand what Kani is generating or encountering on an example
5959
# Enable `debug!` macro logging output when running Kani:
6060
kani --debug file.rs
6161
```
62+
63+
```bash
64+
# Use KANI_LOG for a finer grain control of the source and verbosity of logs.
65+
# E.g.: The command below will print all logs from the kani_middle module.
66+
KANI_LOG="kani_compiler::kani_middle=trace" kani file.rs
67+
```
68+
6269
```bash
6370
# Keep CBMC Symbol Table and Goto-C output (.json and .goto)
6471
kani --keep-temps file.rs

kani-driver/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ unsound_experiments = []
1919
kani_metadata = { path = "../kani_metadata" }
2020
cargo_metadata = "0.15.0"
2121
anyhow = "1"
22+
atty = "0.2.14"
2223
console = "0.15.1"
2324
once_cell = "1.13.0"
2425
serde = { version = "1", features = ["derive"] }
@@ -32,6 +33,9 @@ rustc-demangle = "0.1.21"
3233
pathdiff = "0.2.1"
3334
rayon = "1.5.3"
3435
comfy-table = "6.0.0"
36+
tracing = {version = "0.1", features = ["max_level_trace", "release_max_level_debug"]}
37+
tracing-subscriber = {version = "0.3.8", features = ["env-filter", "json", "fmt"]}
38+
tracing-tree = "0.2.2"
3539

3640
# A good set of suggested dependencies can be found in rustup:
3741
# https://github.com/rust-lang/rustup/blob/master/Cargo.toml

kani-driver/src/call_cargo.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::ffi::OsString;
99
use std::fs;
1010
use std::path::{Path, PathBuf};
1111
use std::process::Command;
12+
use tracing::{debug, trace};
1213

1314
/// The outputs of kani-compiler being invoked via cargo on a project.
1415
pub struct CargoOutputs {
@@ -87,6 +88,7 @@ impl KaniSession {
8788
kani_args.extend_from_slice(&rustc_args);
8889

8990
let packages = packages_to_verify(&self.args, &metadata);
91+
if packages.is_empty() {}
9092
for package in packages {
9193
for target in package_targets(&self.args, package) {
9294
let mut cmd = Command::new("cargo");
@@ -138,7 +140,8 @@ fn glob(path: &Path) -> Result<Vec<PathBuf>> {
138140
/// - This is because `default_members` is not available in cargo metadata.
139141
/// See <https://github.com/rust-lang/cargo/issues/8033>.
140142
fn packages_to_verify<'a, 'b>(args: &'a KaniArgs, metadata: &'b Metadata) -> Vec<&'b Package> {
141-
if !args.package.is_empty() {
143+
debug!(package_selection=?args.package, workspace=args.workspace, "packages_to_verify args");
144+
let packages = if !args.package.is_empty() {
142145
args.package
143146
.iter()
144147
.map(|pkg_name| {
@@ -154,7 +157,9 @@ fn packages_to_verify<'a, 'b>(args: &'a KaniArgs, metadata: &'b Metadata) -> Vec
154157
(true, _) | (_, None) => metadata.workspace_packages(),
155158
(_, Some(root_pkg)) => vec![root_pkg],
156159
}
157-
}
160+
};
161+
trace!(?packages, "packages_to_verify result");
162+
packages
158163
}
159164

160165
/// Possible verification targets.
@@ -182,6 +187,7 @@ fn package_targets(args: &KaniArgs, package: &Package) -> Vec<VerificationTarget
182187
.targets
183188
.iter()
184189
.filter_map(|target| {
190+
debug!(name=?package.name, target=?target.name, kind=?target.kind, "package_targets");
185191
if target.kind.contains(&String::from("bin")) {
186192
Some(VerificationTarget::Bin(target.name.clone()))
187193
} else if target.kind.contains(&String::from("lib")) {

kani-driver/src/session.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ use std::io::Write;
88
use std::path::{Path, PathBuf};
99
use std::process::{Child, Command, ExitStatus, Stdio};
1010
use std::sync::Mutex;
11+
use tracing::level_filters::LevelFilter;
12+
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
13+
use tracing_tree::HierarchicalLayer;
14+
15+
/// Environment variable used to control this session log tracing.
16+
/// This is the same variable used to control `kani-compiler` logs. Note that you can still control
17+
/// the driver logs separately, by using the logger directives to select the kani-driver crate.
18+
/// `export KANI_LOG=kani_driver=debug`.
19+
const LOG_ENV_VAR: &str = "KANI_LOG";
1120

1221
/// Contains information about the execution environment and arguments that affect operations
1322
pub struct KaniSession {
@@ -42,6 +51,7 @@ enum InstallType {
4251

4352
impl KaniSession {
4453
pub fn new(args: KaniArgs) -> Result<Self> {
54+
init_logger(&args);
4555
let install = InstallType::new()?;
4656

4757
Ok(KaniSession {
@@ -260,3 +270,23 @@ fn expect_path(path: PathBuf) -> Result<PathBuf> {
260270
);
261271
}
262272
}
273+
274+
/// Initialize the logger using the KANI_LOG environment variable and `--debug` argument.
275+
fn init_logger(args: &KaniArgs) {
276+
let filter = EnvFilter::from_env(LOG_ENV_VAR);
277+
let filter = if args.debug { filter.add_directive(LevelFilter::DEBUG.into()) } else { filter };
278+
279+
// Use a hierarchical view for now.
280+
let use_colors = atty::is(atty::Stream::Stdout);
281+
let subscriber = Registry::default().with(filter);
282+
let subscriber = subscriber.with(
283+
HierarchicalLayer::default()
284+
.with_writer(std::io::stderr)
285+
.with_indent_lines(true)
286+
.with_ansi(use_colors)
287+
.with_targets(true)
288+
.with_verbose_exit(true)
289+
.with_indent_amount(4),
290+
);
291+
tracing::subscriber::set_global_default(subscriber).unwrap();
292+
}

0 commit comments

Comments
 (0)