I am highly inexpert on gdb. I consider it "unfriendly".
A quick test on your code seems to be "not stopping" on a breakpoint set at _start. If I put a label after the "nop" and set a breakpoint there (and another "nop" after it), instead of on "_start", it does seem to stop(?).
I'd put an "exit" at the end of this, even if it's intended to only be run in a "sandbox" (although Jeff Duntemann doesn't always do so - you got his new book?)
Dunno if that helps...
Best,
Frank