aboutsummaryrefslogtreecommitdiff
path: root/readme.md
diff options
context:
space:
mode:
authorFred Sundvik <fsundvik@gmail.com>2016-11-06 22:44:43 +0200
committerFred Sundvik <fsundvik@gmail.com>2016-11-06 22:44:43 +0200
commit0ba3e523a7c124e4ce54dfd043dc32e72ad3233b (patch)
tree515031fe4d93e9841296d2a1adfe64817a75e6c1 /readme.md
parenta377017c95b826d83ac7a46ef176d39a58294b44 (diff)
downloadqmk_firmware-0ba3e523a7c124e4ce54dfd043dc32e72ad3233b.tar.gz
qmk_firmware-0ba3e523a7c124e4ce54dfd043dc32e72ad3233b.zip
Add documentation for the variable tracing
Diffstat (limited to 'readme.md')
-rw-r--r--readme.md23
1 files changed, 23 insertions, 0 deletions
diff --git a/readme.md b/readme.md
index 60a94d7d6..d5a259ccb 100644
--- a/readme.md
+++ b/readme.md
@@ -343,6 +343,10 @@ This allows you to interface with a Bluefruit EZ-key to send keycodes wirelessly
343 343
344This allows you output audio on the C6 pin (needs abstracting). See the [audio section](#driving-a-speaker---audio-support) for more information. 344This allows you output audio on the C6 pin (needs abstracting). See the [audio section](#driving-a-speaker---audio-support) for more information.
345 345
346`VARIABLE_TRACE`
347
348Use this to debug changes to variable values, see the [tracing variables](#tracing-variables) section for more information.
349
346### Customizing Makefile options on a per-keymap basis 350### Customizing Makefile options on a per-keymap basis
347 351
348If your keymap directory has a file called `Makefile` (note the filename), any Makefile options you set in that file will take precedence over other Makefile options for your particular keyboard. 352If your keymap directory has a file called `Makefile` (note the filename), any Makefile options you set in that file will take precedence over other Makefile options for your particular keyboard.
@@ -1283,3 +1287,22 @@ If there are problems with the tests, you can find the executable in the `./buil
1283It's not yet possible to do a full integration test, where you would compile the whole firmware and define a keymap that you are going to test. However there are plans for doing that, because writing tests that way would probably be easier, at least for people that are not used to unit testing. 1287It's not yet possible to do a full integration test, where you would compile the whole firmware and define a keymap that you are going to test. However there are plans for doing that, because writing tests that way would probably be easier, at least for people that are not used to unit testing.
1284 1288
1285In that model you would emulate the input, and expect a certain output from the emulated keyboard. 1289In that model you would emulate the input, and expect a certain output from the emulated keyboard.
1290
1291# Tracing variables
1292
1293Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both for variables that are changed by the code, and when the variable is changed by some memory corruption.
1294
1295To take the feature into use add `VARIABLE_TRACE=x` to the end of you make command. `x` represents the number of variables you want to trace, which is usually 1.
1296
1297Then at a suitable place in the code, call `ADD_TRACED_VARIABLE`, to begin the tracing. For example to trace all the layer changes, you can do this
1298```c
1299void matrix_init_user(void) {
1300 ADD_TRACED_VARIABLE("layer", &layer_state, sizeof(layer_state));
1301}
1302```
1303
1304This will add a traced variable named "layer" (the name is just for your information), which tracks the memory location of `layer_state`. It tracks 4 bytes (the size of `layer_state`), so any modification to the variable will be reported. By default you can not specify a size bigger than 4, but you can change it by adding `MAX_VARIABLE_TRACE_SIZE=x` to the end of the make command line.
1305
1306In order to actually detect changes to the variables you should call `VERIFY_TRACED_VARIABLES` around the code that you think that modifies the variable. If a variable is modified it will tell you between which two `VERIFY_TRACED_VARIABLES` calls the modification happened. You can then add more calls to track it down further. I don't recommend spamming the codebase with calls. It's better to start with a few, and then keep adding them in a binary search fashion. You can also delete the ones you don't need, as each call need to store the file name and line number in the ROM, so you can run out of memory if you add too many calls.
1307
1308Also remember to delete all the tracing code ones you have found the bug, as you wouldn't want to create a pull request with tracing code. \ No newline at end of file