22 Aug 2013
I was planning to start this post with talking about how I was not very satisfied with my VFS layer and how I would like to rewrite it. But then I rewrote it instead... and ran into a really weird bug.
I'll start with the bug, since it doesn't have anything to do with the VFS, but perhaps someone could help me if I write it down.
So, I was happily coding away when I decided to run my emulator as usual. Since I develop exclusively in a terminal environment right now my setup for testing is four panes in tmux.
Qemu is setup to do nothing until I write 'c' in either the terminal or gdb to allow me to setup breakpoints and such. Only this time, the qemu pane closed immediately before I could do anything at all.
I tried again, with the same results. And again in a desperate display of what Einstein allegedly called madness.
What was the problem? It obviously couldn't be anything in my code. My code didn't even have time to start running!
After a while I reverted my recent changes anyway, and the testing setup ran flawlessly.
What? But my code didn't even run!
I reapplied my changes one at a time and found the line that caused the problem.
int i = 0;
What?? That's it? Declaring a variable?
Anyway. I changed my code about to do the same thing in another way. Debugging worked like a charm, but there was some unexpected behavior. The best way to nail it down seemed to be by printing a short string whenever a function was run. And qemu crashed
What??? Does my emulator hate running working code?
Ok. I've had problems with string before. I ran objdump, commented out the string and ran objdump again and compare the sections. They were probably overlapping some page border and causing some problems I didn't catch with my last linking script update. There really shouldn't be any problems left, but anyone can be wrong. Nothing obvious, though... but when I ran the emulator again, it crashed.
What???? But I commented the problem out. Didn't I?
Removing the commented line fixed the problem.
What????? A comment?
Next I tried running only qemu, without the other panes. It worked like a clock. Starting the terminal console; no problem. Starting gdb... crash! Hm...
Removing the -ggdb
flag from my compiling worked. -g1
worked -g2
did not...
I have a .gdbinit
file in my code root directory, which makes gdb load
debug symbols and attach automatically. It also sets some useful debug
breakpoints, like whenever I encounter unsolvable page faults. It turns
out the breakpoints were the culprit. If I didn't set them, everything
ran fine.
Now I was getting somewhere. I thought.
After running both gdb and qemu through gdb and actually plowing through
the DWARF information from objdump -w
. I finally gave up.
My conclusion: This is either a bug in gcc, a bug in gdb or a bug in qemu. To me the third alternative seems the likeliest by far. My guess is that there's a but in qemus gdb stubs.
If you heard about this bug or experienced it yourself or just have any guesses, please let me know.
Oops.. this grew long... Let's take the VFS some other time, shall we?