summaryrefslogtreecommitdiffhomepage
path: root/doc
diff options
context:
space:
mode:
authorJose Antonio Ortega Ruiz <jao@gnu.org>2019-04-09 02:59:08 +0100
committerJose Antonio Ortega Ruiz <jao@gnu.org>2019-04-09 02:59:08 +0100
commit5c331f54c23dd5db6ee4cd92bf67460935aaec5f (patch)
tree71a0f73e77b7b2afadaf066162225c634abae585 /doc
parent5e854d5060e4874d27049cda500535bb7eabe6d9 (diff)
downloadmdk-5c331f54c23dd5db6ee4cd92bf67460935aaec5f.tar.gz
mdk-5c331f54c23dd5db6ee4cd92bf67460935aaec5f.tar.bz2
Change vm->address_list from GSList to GQueue
The current emulator uses an unbounded linked list for tracking the memory locations our program has traveled through. On a 64 bit system, this requires 16 bytes of data for every instruction a MIX program performs. For small programs that are light on computation cycles, this does not cause a noticeable issue. For programs that execute hundreds of millions of instructions, this causes the memory footprint of the virtual machine to explode. I have attached an example MIXAL program that will cause the VM to grow to over 3 GB of memory usage when run. To run the sample, compile coin-opt.mixal (attached), run it in mixvm, and enter 499 at the prompt. Or use the following steps. This patch changes all the appropriate references to GQueue references and also caps the backtrace at 1000, which can be changed in the mixlib/mix_vm.h header. I feel like 1000 is a reasonable limit for the vast majority of debugging needs. Most people are looking back at the most recent 100 instructions or so. You can get the original behavior (unlimited tracing) back by setting the MIX_MAXTRACE to -1, albeit with a slightly higher memory cost (24 bytes per instruction). Or you can turn it off entirely by setting it to 0. Using a queue doesn't change the logic of the program in any significant way, and it allows programs to run for an extended period of time without consuming all the memory on the machine and slowing down to a crawl. -Kevin Brunelle
Diffstat (limited to 'doc')
-rw-r--r--doc/mdk_mixvm.texi9
1 files changed, 9 insertions, 0 deletions
diff --git a/doc/mdk_mixvm.texi b/doc/mdk_mixvm.texi
index 580f641..f0da1cf 100644
--- a/doc/mdk_mixvm.texi
+++ b/doc/mdk_mixvm.texi
@@ -417,6 +417,15 @@ MIX >
@end example
@end deffn
+@deffn {debug command} sbt [NUMBER]
+This command changes the limit for the backtrace of executed instructions.
+If the number is omitted, the command prints the current limit. If you
+use a 0, backtraces are turned off. This can improve performance. If you
+wish for all the instructions to be logged, a -1 will enable that. The
+amount of memory required for unlimited backtraces can be substantial
+for long-running programs.
+@end deffn
+
@deffn {debug command} pbt [INS_NUMBER]
This command prints a backtrace of executed instructions. Its optional
argument @var{ins_number} is the number of instructions to print. If it