=== What to do when your VSTa kernel crashes === Alas, the VSTa kernel does crash from time to time. If it happens to you, there are some steps you can take which will help the problem get fixed. First, you need to find out if it's the actual kernel, or if it's a boot server. A boot server is a regular user program, but it's one of the intial ones which exist when the kernel starts running. In a non-DEBUG kernel, the process will just quietly exit--it really is just a normal user process. But in the DEBUG kernel, the assumption is that having one of your initial processes die is such a bad thing, that the system should stop and let you find out what went wrong. In either case, you end up in the kernel debugger. So the first step is to figure out if it's the kernel that died, or a boot server. So how do you tell? Easy. If the message is: Boot process <pid> dies then it's a boot process which has failed. Otherwise it's the whole kernel which has failed. ==== Boot process failure ==== If a user process dies, you can still gather a stack backtrace of sorts. You don't get symbols, but at least you will have something which can be mapped to symbols by somebody who has a running VSTa system with an executable with symbols. You get the stack backtrace by doing: tf -- Kernel debugger, ask for trap frame First note the "eip" value, which was the instruction which took the user program into the kernel. Take the "ebp" value, which should be less than 0x80000000. Bitwise OR in 0x80000000. So if the address looks like 0x7fffff00, you would make this 0xffffff00. Do "dv 0xffffff00 2". What you get back is a pair of hex numbers. The first is the next stack frame in from the fault; the second is the program counter value. Note the PC value. Then do the same transformation of the stack frame address, and do, say, "dv 0xffffffc0" (the count 2 will be remembered from the previous command). This will give you another pair of hex addresses; again note the PC value, and iterate until you get zeroes (top stack frame). You now have a stack backtrace, and those PC values indicate the nested callers. ==== Kernel failure ==== For most assertion failures, you can just do "bt", and the kernel debugger will give you a stack backtrace. However, in the case of "kernel fault" errors, you need to do a backtrace of the stack following from the kernel trap. So again do "tf", and get the trap frame from the failed instruction. The kernel backtrace method is much the same as for a user boot process, except you don't have to OR in 0x80000000 to the values. When you do "tf", take the program counter ("eip") and do a "= <eip>" on whatever hex value the kernel debugger indicated. This is the address of the faulting instruction. Now take the "ebp" value, and do "dv <addr> 2". You'll get back a pair of numbers. Do "= <PC>" (where <PC> is the second of those hex numbers), and you'll get the symbolic location for that program counter value. Now take the first of those addresses, and do "dv <value>", get another pair of numbers, and work your way backwards, getting PC values and turning them into symbolic values. At your option, either send this directly to vandys@vsta.org, or you can post it to the appropriate VSTa Wiki discussion forum. There used to be a mailing list, but spam has made that a thing of the past.