Update the doc related to complier logging

This commit is contained in:
king6cong 2019-01-18 00:06:00 +08:00 committed by Who? Me?!
parent cdd17886a2
commit 1510687145
1 changed files with 15 additions and 44 deletions

View File

@ -1,7 +1,3 @@
**Note: This is copied from the
[rust-forge](https://github.com/rust-lang-nursery/rust-forge). If anything needs
updating, please open an issue or make a PR on the github repo.**
# Debugging the compiler # Debugging the compiler
[debugging]: #debugging [debugging]: #debugging
@ -134,6 +130,11 @@ $ # Cool, now I have a backtrace for the error
## Getting logging output ## Getting logging output
[getting-logging-output]: #getting-logging-output [getting-logging-output]: #getting-logging-output
These crates are used in compiler for logging:
* [log]
* [env-logger]: check the link to see the full `RUST_LOG` syntax
The compiler has a lot of `debug!` calls, which print out logging information The compiler has a lot of `debug!` calls, which print out logging information
at many points. These are very useful to at least narrow down the location of at many points. These are very useful to at least narrow down the location of
a bug if not to find it entirely, or just to orient yourself as to why the a bug if not to find it entirely, or just to orient yourself as to why the
@ -141,10 +142,8 @@ compiler is doing a particular thing.
To see the logs, you need to set the `RUST_LOG` environment variable to To see the logs, you need to set the `RUST_LOG` environment variable to
your log filter, e.g. to get the logs for a specific module, you can run the your log filter, e.g. to get the logs for a specific module, you can run the
compiler as `RUST_LOG=module::path rustc my-file.rs`. The Rust logs are compiler as `RUST_LOG=module::path rustc my-file.rs`. All `debug!` output will
powered by [env-logger], and you can look at the docs linked there to see then appear in standard error.
the full `RUST_LOG` syntax. All `debug!` output will then appear in
standard error.
Note that unless you use a very strict filter, the logger will emit a *lot* Note that unless you use a very strict filter, the logger will emit a *lot*
of output - so it's typically a good idea to pipe standard error to a file of output - so it's typically a good idea to pipe standard error to a file
@ -176,8 +175,10 @@ $ RUST_LOG=debug rustc +local my-file.rs 2>all-log
$ RUST_LOG=rustc_trans=info rustc +local my-file.rs $ RUST_LOG=rustc_trans=info rustc +local my-file.rs
``` ```
While calls to `info!` are included in every build of the compiler, ### How to keep or remove `debug!` and `trace!` calls from the resulting binary
calls to `debug!` are only included in the program if the
While calls to `error!`, `warn!` and `info!` are included in every build of the compiler,
calls to `debug!` and `trace!` are only included in the program if
`debug-assertions=yes` is turned on in config.toml (it is `debug-assertions=yes` is turned on in config.toml (it is
turned off by default), so if you don't see `DEBUG` logs, especially turned off by default), so if you don't see `DEBUG` logs, especially
if you run the compiler with `RUST_LOG=rustc rustc some.rs` and only see if you run the compiler with `RUST_LOG=rustc rustc some.rs` and only see
@ -200,48 +201,18 @@ However, there are still a few concerns that you might care about:
### Expensive operations in logs ### Expensive operations in logs
A note of caution: the expressions *within* the `debug!` call are run If in the module `rustc::foo` you have a statement
whenever RUST_LOG is set, even if the filter would exclude the log. This means
that if in the module `rustc::foo` you have a statement
```Rust ```Rust
debug!("{:?}", random_operation(tcx)); debug!("{:?}", random_operation(tcx));
``` ```
Then if someone runs a debug `rustc` with `RUST_LOG=rustc::bar`, then Then if someone runs a debug `rustc` with `RUST_LOG=rustc::bar`, then
`random_operation()` will still run - even while it's output will never be `random_operation()` will run.
needed!
This means that you should not put anything too expensive or likely This means that you should not put anything too expensive or likely
to crash there - that would annoy anyone who wants to use logging for their own to crash there - that would annoy anyone who wants to use logging for their own
module. Note that if `RUST_LOG` is unset (the default), then the code will not module. No-one will know it until someone tries to use logging to find *another* bug.
run - this means that if your logging code panics, then no-one will know it
until someone tries to use logging to find *another* bug.
If you *need* to do an expensive operation in a log, be aware that while log
expressions are *evaluated* even if logging is not enabled in your module,
they are not *formatted* unless it *is*. This means you can put your
expensive/crashy operations inside an `fmt::Debug` impl, and they will not be
run unless your log is enabled:
```Rust
use std::fmt;
struct ExpensiveOperationContainer<'a, 'gcx, 'tcx>
where 'tcx: 'gcx, 'a: 'tcx
{
tcx: TyCtxt<'a, 'gcx, 'tcx>
}
impl<'a, 'gcx, 'tcx> fmt::Debug for ExpensiveOperationContainer<'a, 'gcx, 'tcx> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let value = random_operation(tcx);
fmt::Debug::fmt(&value, fmt)
}
}
debug!("{:?}", ExpensiveOperationContainer { tcx });
```
## Formatting Graphviz output (.dot files) ## Formatting Graphviz output (.dot files)
[formatting-graphviz-output]: #formatting-graphviz-output [formatting-graphviz-output]: #formatting-graphviz-output
@ -382,7 +353,7 @@ create a minimal working example with Godbolt. Go to
5. Once you have a godbolt link demonstrating the issue, it is pretty easy to 5. Once you have a godbolt link demonstrating the issue, it is pretty easy to
fill in an LLVM bug. fill in an LLVM bug.
[log]: https://docs.rs/log/0.4.6/log/index.html
[env-logger]: https://docs.rs/env_logger/0.4.3/env_logger/ [env-logger]: https://docs.rs/env_logger/0.4.3/env_logger/
## Narrowing (Bisecting) Regressions ## Narrowing (Bisecting) Regressions