12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- ##[
- Utilities to help with debugging nim compiler.
- Experimental API, subject to change.
- ]##
- #[
- ## example
- useful debugging flags:
- --stacktrace -d:debug -d:nimDebugUtils
- nim c -o:bin/nim_temp --stacktrace -d:debug -d:nimDebugUtils compiler/nim
- ## future work
- * expose and improve astalgo.debug, replacing it by std/prettyprints,
- refs https://github.com/nim-lang/RFCs/issues/385
- ]#
- import options
- import std/wrapnils
- export wrapnils
- # allows using things like: `?.n.sym.typ.len`
- import std/stackframes
- export stackframes
- # allows using things like: `setFrameMsg c.config$n.info & " " & $n.kind`
- # which doesn't log, but augments stacktrace with side channel information
- var conf0: ConfigRef
- proc onNewConfigRef*(conf: ConfigRef) {.inline.} =
- ## Caches `conf`, which can be retrieved with `getConfigRef`.
- ## This avoids having to forward `conf` all the way down the call chain to
- ## procs that need it during a debugging session.
- conf0 = conf
- proc getConfigRef*(): ConfigRef =
- ## nil, if -d:nimDebugUtils wasn't specified
- result = conf0
- proc isCompilerDebug*(): bool =
- ##[
- Provides a simple way for user code to enable/disable logging in the compiler
- in a granular way. This can then be used in the compiler as follows:
- ```nim
- if isCompilerDebug():
- echo ?.n.sym.typ.len
- ```
- ]##
- runnableExamples:
- proc main =
- echo 2
- {.define(nimCompilerDebug).}
- echo 3.5 # code section in which `isCompilerDebug` will be true
- {.undef(nimCompilerDebug).}
- echo 'x'
- conf0.isDefined("nimCompilerDebug")
- proc enteringDebugSection*() {.exportc, dynlib.} =
- ## Provides a way for native debuggers to enable breakpoints, watchpoints, etc
- ## when code of interest is being compiled.
- ##
- ## Set your debugger to break on entering `nimCompilerIsEnteringDebugSection`
- ## and then execute a desired command.
- discard
- proc exitingDebugSection*() {.exportc, dynlib.} =
- ## Provides a way for native debuggers to disable breakpoints, watchpoints, etc
- ## when code of interest is no longer being compiled.
- ##
- ## Set your debugger to break on entering `exitingDebugSection`
- ## and then execute a desired command.
- discard
|