diff --git a/README.md b/README.md index cbaa190..be4405d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1555 TILs and counting..._ +_1556 TILs and counting..._ --- @@ -403,6 +403,7 @@ _1555 TILs and counting..._ - [Access Go Docs Offline](go/access-go-docs-offline.md) - [Add A Method To A Struct](go/add-a-method-to-a-struct.md) +- [Basic Delve Debugging Session](go/basic-delve-debugging-session.md) - [Build For A Specific OS And Architecture](go/build-for-a-specific-os-and-architecture.md) - [Check If Cobra Flag Was Set](go/check-if-cobra-flag-was-set.md) - [Combine Two Slices](go/combine-two-slices.md) diff --git a/go/basic-delve-debugging-session.md b/go/basic-delve-debugging-session.md new file mode 100644 index 0000000..815f66f --- /dev/null +++ b/go/basic-delve-debugging-session.md @@ -0,0 +1,63 @@ +# Basic Delve Debugging Session + +When using [delve](https://github.com/go-delve/delve) to debug a Go program, +these are the series of things I usually find myself doing. + +First, I start running the program with `dlv` including any arguments after a `--` (in my case, the `solve` subcommand and a filename). + +```bash +$ dlv debug . -- solve samples/001.txt +``` + +`dlv` starts up and is ready to run my program from the beginning. I'll need to +set a couple breakpoints before continuing. I do this with the `break` command, +specifying the filename and line number. + +``` +(dlv) break main.go:528 +Breakpoint 1 set at 0x10c1a5bea for main.traversePuzzleIterative() ./main.go:528 +(dlv) break main.go:599 +Breakpoint 2 set at 0x10c1a6dcc for main.traversePuzzleIterative() ./main.go:599 +``` + +Now I can continue which will run the program until hitting a breakpoint. + +``` +(dlv) continue +> [Breakpoint 2] main.traversePuzzleIterative() ./main.go:599 (hits goroutine(1):1 total:1) (PC: 0x10c1a6dcc) + 594: } + 595: } + 596: + 597: topStackFrame := stack[len(stack)-1] + 598: // if the current stack frame has more values, try the next +=> 599: if len(topStackFrame.PossibleValues) > 0 { + 600: nextValue := topStackFrame.PossibleValues[0] + 601: topStackFrame.PossibleValues = topStackFrame.PossibleValues[1:] + 602: topStackFrame.CurrValue = nextValue + 603: + 604: // Undo the last placement and make a new one +``` + +I can see the context around the line we've stopped on. From here I can dig +into the current state of the program by looking at local variables (`locals`) +or printing out a specific value (`print someVar`). I can continue to step +through the program line by line with `next` or eventually run `continue` to +proceed to the next breakpoint. + +``` +(dlv) locals +diagnostics = main.Diagnostics {BacktrackCount: 0, NodeVisitCount: 1, ValidityCheckCount: 2,...+2 more} +stack = []main.StackData len: 1, cap: 1, [...] +emptyCellPositions = [][]int len: 3, cap: 4, [...] +emptyCellIndex = 1 +status = "Invalid" +topStackFrame = main.StackData {RowIndex: 1, ColumnIndex: 7, PossibleValues: []int len: 8, cap: 8, [...],...+1 more} +(dlv) print topStackFrame +main.StackData { + RowIndex: 1, + ColumnIndex: 7, + PossibleValues: []int len: 8, cap: 8, [2,3,4,5,6,7,8,9], + CurrValue: 1,} +(dlv) next +> main.traversePuzzleIterative() ./main.go:600 (PC: 0x10c1a6dea) +```