Virtual File System

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.

The 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.

  • One pane runs qemu and displays its output.
  • One pane controls the qemu terminal through telnet.
  • One pane displays the serial output of qemu.
  • One pane runs gdb connected to qemu.

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?


comments powered by Disqus
© 2012 Thomas Lovén - @thomasloven - GitHub