Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Display causes but not stack trace in CLI error report #7584

Merged
merged 4 commits into from
Mar 5, 2025

Conversation

aakoshh
Copy link
Contributor

@aakoshh aakoshh commented Mar 5, 2025

Description

Problem*

Resolves something I noticed while reviewing #7578

Summary*

Some of the CLI used eprintln!("{report}") to display errors, while others use eprintln!("{report:?}").
Using the former with eyre means we only see the outermost .context(msg), which can hide a lot useful details about the original error. See https://docs.rs/eyre/latest/eyre/struct.Report.html#display-representations

Additional Context

For example if I point the profiler to a non-existing artifact, all we see it this:

$ ./target/debug/noir-profiler opcodes --artifact-path  ./test_programs/execution_success/blah.json --output test.json
Error reading program from file

With eprintln!("{report:?}"); we get the nested contextual messages like a stack, and the stack trace:

$ ...
Error reading program from file

Caused by:
    No such file or directory (os error 2)

Location:
    tooling/profiler/src/cli/opcodes_flamegraph_cmd.rs:46:47

With eprintln!("{report:#}") we get a more compact output that omits source code locations (which could be considered an implementation detail that should not concern the user, but I'd only recommend it if we used .context more vigorously to provide a human readable trace):

$ ...
Error reading program from file: No such file or directory (os error 2)

Since noir-inspector and noir-execute use :? I thought we can stick to that for now.

Documentation*

Check one:

  • No documentation needed.
  • Documentation included in this PR.
  • [For Experimental Features] Documentation to be submitted in a separate PR.

PR Checklist*

  • I have tested the changes locally.
  • I have formatted the changes with Prettier and/or cargo fmt on default settings.

@aakoshh aakoshh requested review from vezenovm and TomAFrench March 5, 2025 12:14
@aakoshh aakoshh changed the title Use debug format to display error reports fix: Use debug format to display error reports Mar 5, 2025
Copy link
Contributor

@vezenovm vezenovm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had removed eprintln!("{report:?}"); for eprintln!("{report}"); in the profiler as I didn't want to expose internal details to the user for CLI errors.

For example now in nargo let's say I forget to include a Prover.toml:

Cannot find input file '/mnt/user-data/maxim/noir/test_programs/execution_success/1_mul/Prover.toml'

Location:
    tooling/nargo_cli/src/cli/mod.rs:137:5

I don't think we should be showing the CLI locations to the user. I find it actually more confusing.

Perhaps we can have something similar to RUST_BACKTRACE=1 for debugging mode. However, this is normally used for Rust panics. So we can run nargo with this flag already if we have an internal panic, and for Noir execution, we already provide full call stacks.

@aakoshh
Copy link
Contributor Author

aakoshh commented Mar 5, 2025

I had removed eprintln!("{report:?}"); for eprintln!("{report}"); in the profiler as I didn't want to expose internal details to the user for CLI errors.

Okay, like I mentioned in the description we can use eprintln!("{report:#}") to display as much of the context of what went wrong as possible, including the original error message, and all the contextual messages that got attached to it. I'll change the value accordingly to all CLIs. Like I said it's just less likely to tell us exactly what you want to know, unless we consistently provide good error messages and contexts. For example some std::io::Error will say that "file not found" but won't say which one, unless the thing that called it used .context or .wrap_err to give hints, or maybe .with_context to even attach the path, or if we used a custom error message which captured the arguments we had problem with. Even then, if somebody used .context on top of our custom error, the message of the .context would be the only one shown with {report} which is usually very frustrating.

@aakoshh aakoshh changed the title fix: Use debug format to display error reports fix: Display causes but not stack trace in CLI error report Mar 5, 2025
@aakoshh aakoshh requested a review from vezenovm March 5, 2025 14:01
@aakoshh
Copy link
Contributor Author

aakoshh commented Mar 5, 2025

I suppose we could have an env var to influence the report format, like if RUST_BACKTRACE itself is set we can use debug format to help in cases where the error is nondescript.

@vezenovm
Copy link
Contributor

vezenovm commented Mar 5, 2025

eprintln!("{report:#}")

Yeah I think this is better than {report:?}.

Like I said it's just less likely to tell us exactly what you want to know, unless we consistently provide good error messages and contexts.

I understand your desire for more information in the error reports. I do think for public facing binaries we should consistently provide good error messages and contexts through our noirc_errors reporter.

This method is used in nargo_cli for reporting execution failures and I recently started using it in the profiler as well when I switched {report:?} to {report}.

@aakoshh
Copy link
Contributor Author

aakoshh commented Mar 5, 2025

Yes, for the errors generated about Noir that's fantastic 👍 This is more for just the bits and bobs that can go wrong in the CLI, opening and decoding files, etc.

@aakoshh aakoshh enabled auto-merge March 5, 2025 14:10
@aakoshh aakoshh added this pull request to the merge queue Mar 5, 2025
@vezenovm
Copy link
Contributor

vezenovm commented Mar 5, 2025

Yes, for the errors generated about Noir that's fantastic 👍 This is more for just the bits and bobs that can go wrong in the CLI, opening and decoding files, etc.

Yeah I understand, I just didn't want to muddle user errors. If {report:#} is insufficient I think we should look at an env var to influence extra debug info.

Merged via the queue into master with commit d57e0ac Mar 5, 2025
104 checks passed
@aakoshh aakoshh deleted the fix-error-report-format branch March 5, 2025 14:21
AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Mar 6, 2025
chore!: bump bb version to v0.77.0 (noir-lang/noir#7599)
chore: bump external pinned commits (noir-lang/noir#7601)
feat(cli): Log and replay oracle transcript (noir-lang/noir#7417)
chore: some SSA improvements (noir-lang/noir#7588)
chore(profiler): Add option to only get the total sample count for the `execution-opcodes` command (noir-lang/noir#7578)
feat(experimental): Issue errors for unreachable match branches (noir-lang/noir#7556)
fix: Log to `stderr` (noir-lang/noir#7585)
chore!: remove merkle module from stdlib (noir-lang/noir#7582)
fix: Display causes but not stack trace in CLI error report (noir-lang/noir#7584)
chore: bump `light-poseidon` (noir-lang/noir#7568)
chore: bump external pinned commits (noir-lang/noir#7581)
chore!: remove deprecated hash functions from stdlib (noir-lang/noir#7477)
fix(frontend)!: Restrict capturing mutable variable in lambdas (noir-lang/noir#7488)
feat: perform constant sha256 compressions at compile-time (noir-lang/noir#7566)
chore: bump external pinned commits (noir-lang/noir#7565)
chore(ssa): Turn the Brillig constraints check back on by default (noir-lang/noir#7404)
chore: bump external pinned commits (noir-lang/noir#7561)
chore: address some frontend tests TODOs (noir-lang/noir#7554)
fix: shift right overflow in ACIR with unknown var now returns zero (noir-lang/noir#7509)
chore(cli): Forward `nargo execute` to `noir_artifact_cli` (noir-lang/noir#7406)
feat: Support `<Type as Trait>::method` in expressions (noir-lang/noir#7551)
chore: remove FileDiagnostic (noir-lang/noir#7546)
chore: add some extra tests (noir-lang/noir#7544)
fix: fix a few cases where safety comment wasn't correctly identified (noir-lang/noir#7548)
chore!: remove U128 struct from stdlib (noir-lang/noir#7529)
feat: simplify simple conditionals for brillig (noir-lang/noir#7205)
chore: put RcTracker as part of the DIE context (noir-lang/noir#7309)
AztecBot added a commit to AztecProtocol/aztec-packages that referenced this pull request Mar 6, 2025
chore!: bump bb version to v0.77.0 (noir-lang/noir#7599)
chore: bump external pinned commits (noir-lang/noir#7601)
feat(cli): Log and replay oracle transcript (noir-lang/noir#7417)
chore: some SSA improvements (noir-lang/noir#7588)
chore(profiler): Add option to only get the total sample count for the `execution-opcodes` command (noir-lang/noir#7578)
feat(experimental): Issue errors for unreachable match branches (noir-lang/noir#7556)
fix: Log to `stderr` (noir-lang/noir#7585)
chore!: remove merkle module from stdlib (noir-lang/noir#7582)
fix: Display causes but not stack trace in CLI error report (noir-lang/noir#7584)
chore: bump `light-poseidon` (noir-lang/noir#7568)
chore: bump external pinned commits (noir-lang/noir#7581)
chore!: remove deprecated hash functions from stdlib (noir-lang/noir#7477)
fix(frontend)!: Restrict capturing mutable variable in lambdas (noir-lang/noir#7488)
feat: perform constant sha256 compressions at compile-time (noir-lang/noir#7566)
chore: bump external pinned commits (noir-lang/noir#7565)
chore(ssa): Turn the Brillig constraints check back on by default (noir-lang/noir#7404)
chore: bump external pinned commits (noir-lang/noir#7561)
chore: address some frontend tests TODOs (noir-lang/noir#7554)
fix: shift right overflow in ACIR with unknown var now returns zero (noir-lang/noir#7509)
chore(cli): Forward `nargo execute` to `noir_artifact_cli` (noir-lang/noir#7406)
feat: Support `<Type as Trait>::method` in expressions (noir-lang/noir#7551)
chore: remove FileDiagnostic (noir-lang/noir#7546)
chore: add some extra tests (noir-lang/noir#7544)
fix: fix a few cases where safety comment wasn't correctly identified (noir-lang/noir#7548)
chore!: remove U128 struct from stdlib (noir-lang/noir#7529)
feat: simplify simple conditionals for brillig (noir-lang/noir#7205)
chore: put RcTracker as part of the DIE context (noir-lang/noir#7309)
TomAFrench added a commit that referenced this pull request Mar 6, 2025
* master: (65 commits)
  feat: Compare bincode to CBOR, FlexBuffers and Protobuf - implement best (#7513)
  chore: track more critical libraries (#7604)
  chore!: bump bb version to v0.77.0 (#7599)
  chore: bump external pinned commits (#7601)
  feat(cli): Log and replay oracle transcript (#7417)
  chore: some SSA improvements (#7588)
  chore(profiler): Add option to only get the total sample count for the `execution-opcodes` command (#7578)
  feat(experimental): Issue errors for unreachable match branches (#7556)
  fix: Log to `stderr` (#7585)
  chore!: remove merkle module from stdlib (#7582)
  fix: Display causes but not stack trace in CLI error report (#7584)
  chore: bump `light-poseidon` (#7568)
  chore: bump external pinned commits (#7581)
  chore!: remove deprecated hash functions from stdlib (#7477)
  fix(frontend)!: Restrict capturing mutable variable in lambdas (#7488)
  feat: perform constant sha256 compressions at compile-time (#7566)
  chore: bump external pinned commits (#7565)
  chore(ssa): Turn the Brillig constraints check back on by default (#7404)
  chore: bump external pinned commits (#7561)
  chore: address some frontend tests TODOs (#7554)
  ...
rahul-kothari pushed a commit to AztecProtocol/aztec-packages that referenced this pull request Mar 7, 2025
🤖 I have created a new Aztec Packages release
---


##
[0.78.0](v0.77.1...v0.78.0)
(2025-03-07)


### ⚠ BREAKING CHANGES

* convert `TraitMethodNotInScope` to error
(noir-lang/noir#7427)
* bump bb version to v0.77.0
(noir-lang/noir#7599)
* remove merkle module from stdlib
(noir-lang/noir#7582)
* remove deprecated hash functions from stdlib
(noir-lang/noir#7477)
* **frontend:** Restrict capturing mutable variable in lambdas
(noir-lang/noir#7488)
* remove U128 struct from stdlib
(noir-lang/noir#7529)

### Features

* **barretenberg:** Graph methods for circuit analysis (part 2)
([#12130](#12130))
([ec4c0c4](ec4c0c4))
* **cli:** Log and replay oracle transcript
(noir-lang/noir#7417)
([f13b729](f13b729))
* Compare bincode to CBOR, FlexBuffers and Protobuf - implement best
(noir-lang/noir#7513)
([8eb727c](8eb727c))
* **experimental:** Enable ownership syntax
(noir-lang/noir#7603)
([1a3c112](1a3c112))
* **experimental:** Issue errors for unreachable match branches
(noir-lang/noir#7556)
([f13b729](f13b729))
* nullify just-added notes
([#12552](#12552))
([dcba7a4](dcba7a4))
* perform constant sha256 compressions at compile-time
(noir-lang/noir#7566)
([f13b729](f13b729))
* relate errors to macro built-ins errors
(noir-lang/noir#7609)
([fbaa634](fbaa634))
* simplify simple conditionals for brillig
(noir-lang/noir#7205)
([f13b729](f13b729))
* Support `&lt;Type as Trait&gt;::method` in expressions
(noir-lang/noir#7551)
([f13b729](f13b729))
* Sync from aztec-packages (noir-lang/noir#7606)
([8eb727c](8eb727c))
* teardown in call interface
([#12499](#12499))
([062df02](062df02))
* translation evaluations with zk
([#12222](#12222))
([568982d](568982d))


### Bug Fixes

* **avm:** use the correct number of rows in check_interaction
([#12519](#12519))
([b1284ef](b1284ef))
* aztec-up
([#12509](#12509))
([3ddb6de](3ddb6de))
* bbup
([#12555](#12555))
([e7b5353](e7b5353))
* Bitwise lookup
([#12471](#12471))
([a38f353](a38f353))
* **ci:** remove regex - transfer explicitly
([#12525](#12525))
([352bb1d](352bb1d))
* Cl/fix arm anvil
([#12565](#12565))
([e4bfbd1](e4bfbd1))
* compare Quoted by expanding interned values
(noir-lang/noir#7602)
([1a3c112](1a3c112))
* Display causes but not stack trace in CLI error report
(noir-lang/noir#7584)
([f13b729](f13b729))
* **experimental:** Fix execution of match expressions with multiple
branches (noir-lang/noir#7570)
([1a3c112](1a3c112))
* fix a few cases where safety comment wasn't correctly identified
(noir-lang/noir#7548)
([f13b729](f13b729))
* fix bbup and add CI
([#12541](#12541))
([1b2604c](1b2604c))
* Fix the config
([#12513](#12513))
([fb9fac6](fb9fac6))
* **frontend:** Restrict capturing mutable variable in lambdas
(noir-lang/noir#7488)
([f13b729](f13b729))
* FunctionDefinition::as_typed_expr didn't work well for trait imp…
(noir-lang/noir#7611)
([1a3c112](1a3c112))
* Log to `stderr` (noir-lang/noir#7585)
([f13b729](f13b729))
* **LSP:** references/rename only when underlying span has the correct…
(noir-lang/noir#7598)
([8eb727c](8eb727c))
* make vk metadata actual witnesses
([#12459](#12459))
([dada06f](dada06f))
* no fast deployments when the boot node needs to restart.
([#12557](#12557))
([866582e](866582e))
* **node:** drop log level of handler not registered
([#12523](#12523))
([cb7e42d](cb7e42d))
* override bb path in cli-wallet PXE config
([#12511](#12511))
([0c3024e](0c3024e))
* publish-bb-mac.yml version replace
([#12554](#12554))
([7e89dfb](7e89dfb))
* release bb-mac
([fac5fb5](fac5fb5))
* Revert "make vk metadata actual witnesses"
([#12534](#12534))
([ed46a3c](ed46a3c))
* shift right overflow in ACIR with unknown var now returns zero
(noir-lang/noir#7509)
([f13b729](f13b729))
* TokensPrettyPrinter was missing some spaces between tokens
(noir-lang/noir#7607)
([1a3c112](1a3c112))
* yarn-project e2e bench
([#12547](#12547))
([b40b904](b40b904))


### Miscellaneous

* add some extra tests (noir-lang/noir#7544)
([f13b729](f13b729))
* add underscore parameter documentation
(noir-lang/noir#7562)
([1a3c112](1a3c112))
* add yaml aliases in .test_patterns.yml
([#12516](#12516))
([3ee8d51](3ee8d51))
* address some frontend tests TODOs
(noir-lang/noir#7554)
([f13b729](f13b729))
* addressing remaining feedback in PR 12182
([#12494](#12494))
([f733879](f733879)),
closes
[#12193](#12193)
* bump `light-poseidon` (noir-lang/noir#7568)
([f13b729](f13b729))
* bump bb version to v0.77.0
(noir-lang/noir#7599)
([f13b729](f13b729))
* bump external pinned commits
(noir-lang/noir#7561)
([f13b729](f13b729))
* bump external pinned commits
(noir-lang/noir#7565)
([f13b729](f13b729))
* bump external pinned commits
(noir-lang/noir#7581)
([f13b729](f13b729))
* bump external pinned commits
(noir-lang/noir#7601)
([f13b729](f13b729))
* bump external pinned commits
(noir-lang/noir#7618)
([fbaa634](fbaa634))
* bump ring to address advisory
(noir-lang/noir#7619)
([fbaa634](fbaa634))
* Cleaner PXE
([#12515](#12515))
([a69f416](a69f416))
* cleanup committing and masking utility
([#12514](#12514))
([9f57048](9f57048))
* **cli:** exclude kind smoke test from flake list
([#12518](#12518))
([778bfa6](778bfa6))
* **cli:** Forward `nargo execute` to `noir_artifact_cli`
(noir-lang/noir#7406)
([f13b729](f13b729))
* convert `TraitMethodNotInScope` to error
(noir-lang/noir#7427)
([fbaa634](fbaa634))
* explode aliases when looking up owners in `.test_patterns.yml`
([#12526](#12526))
([2e0d791](2e0d791))
* fix trait import issues
([#12500](#12500))
([fd9f145](fd9f145))
* Fix yarn install immutable issues
([#12539](#12539))
([fb9ada3](fb9ada3)),
closes
[#12538](#12538)
* More config defaults and forward p2p ports
([#12529](#12529))
([2c45fb9](2c45fb9))
* **node:** return correct node version
([#12520](#12520))
([5502901](5502901))
* **profiler:** Add option to only get the total sample count for the
`execution-opcodes` command
(noir-lang/noir#7578)
([f13b729](f13b729))
* put RcTracker as part of the DIE context
(noir-lang/noir#7309)
([f13b729](f13b729))
* remove deprecated hash functions from stdlib
(noir-lang/noir#7477)
([f13b729](f13b729))
* remove FileDiagnostic (noir-lang/noir#7546)
([f13b729](f13b729))
* remove merkle module from stdlib
(noir-lang/noir#7582)
([f13b729](f13b729))
* Remove scope interpolation from env vars
([#12522](#12522))
([70942e9](70942e9))
* remove U128 struct from stdlib
(noir-lang/noir#7529)
([f13b729](f13b729))
* replace relative paths to noir-protocol-circuits
([f20c0dd](f20c0dd))
* replace relative paths to noir-protocol-circuits
([4365064](4365064))
* restore bb --version
([#12542](#12542))
([ab13d43](ab13d43))
* restore method syntax on `get_storage_slot` calls
([#12532](#12532))
([8e9f594](8e9f594))
* rm unused methods
([#12544](#12544))
([ed1dbdc](ed1dbdc))
* some SSA improvements (noir-lang/noir#7588)
([f13b729](f13b729))
* **spartan:** kind test speedup
([#12478](#12478))
([8ede7b1](8ede7b1))
* **ssa:** Turn the Brillig constraints check back on by default
(noir-lang/noir#7404)
([f13b729](f13b729))
* track more critical libraries
(noir-lang/noir#7604)
([f13b729](f13b729))
* update and lock AVM's lockfile
([#12533](#12533))
([2babc50](2babc50))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants