Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make gdb follow execv? Not working despite "follow-exec-mode"

i've written two simple programs:

int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest2", argv );
}

and

int main(int ac, char **argv ) {
    execv( "/home/me/Desktop/execvtest1", argv );
}

I've compiled them with gcc -g to the according outputfiles. I'm running Ubuntu 10.10 using gcc (Ubuntu/Linaro 4.4.4-14ubuntu5.1) 4.4.5.

When I'm debuging the first program with GNU gdb (GDB) 7.2-ubuntu, I can step until the first execv statement, but then the two files just keep running. Even if I set the follow-exec-mode to new, I can't step into the second program. When I set catch exec, gdb stops at each call to execv (some how without linked source for the second program, and I'm not able to quit gdb, as it kind of hangs!?), but I'm not able to step over the call into the "new" (as exec replaces the process) inferior program.

So how can this be done? There must be a way to step into the new process right? Am I doing something wrong?

Cheers

like image 310
roemer Avatar asked May 20 '12 06:05

roemer


2 Answers

you can use "catch" command. this will give you chance to put some break points after you exec

like image 195
daehee Avatar answered Oct 05 '22 16:10

daehee


I've been doing something very similar to what you are doing for one of my classes. It is a bit hackish and if you're trying to get things like register values it may mess things up. According to GDB's documentation you can change the symbol file while maintaining the execution file. To do this, simply use the command symbol-file file2. Note that this must be a binary file compiled with the GDB flag (-g in GCC). After you've loaded this symbol file, you will not be able to break or see any of the lines for the original execution file. However, you may set break points for the new symbol file i.e. break file2.c:40 and then step through execution just as before. It is a bit hackish and may not work perfectly because you are essentially catching the execution of a new process and mapping it to the symbol table of it's binary file, without using that binary file to run it directly. I haven't had stellar results but you can see the intermediate values this way. Another thing, in order to return to debugging the original file you will have to do symbol-file file to reload it's symbol table.

like image 35
Lars Sorenson Avatar answered Oct 05 '22 16:10

Lars Sorenson