Ich bin auf Linux mit Gdb-Version 6.8-debian. Ich war neugierig darauf, wie die Hauptfunktion in einem C-Programm ausgeführt wird und herumspielt und an verschiedenen Stellen sucht, ich habe gelernt, dass dafür die Funktion __libc_start_main zuständig ist. Die Argumente für __libc_start_main sind unter anderem: Die Adresse von main (wie wir von c wissen, der Pfad ist immer als argv [0] angegeben), der nächste argc, der im Register ESI liegen sollte, und die nächste Adresse von argv, die sein sollte in ECX.Zugriff auf Kommandozeilenargumente mit gdb
rumspielen habe ich das folgende einfache Programm, cmdargs.c, die einfach gibt das erste Argument Befehlszeile beim Start gegeben:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
printf("%s: %s\n", "argv[1]", *++argv);
return EXIT_SUCCESS;
}
Jetzt beginne ich zu debuggen cmdargs und einen Haltepunkt auf der Haupt gesetzt und __libc_start_main (info von Start-gDB entfernt):
gdb cmdargs
(gdb) b main
Breakpoint 1 at 0x80483d2
(gdb) b __libc_start_main
Breakpoint 2 at 0xb7f3f5a8
(gdb) r qwerty
Hier traf ich den Haltepunkt 2 in __libc_start_main und kann sehen argc und argv [0] mit
(gdb) p $esi
und
(gdb) x/s *($ecx)
Das funktioniert wie erwartet, aber wie kann ich auf dem ersten nicht-implizite Kommandozeilenargument "qwerty"? Ich habe versucht, bis zum Breakpoint bei main weiterzumachen und einzutreten, aber argc und argv werden nicht erkannt (Warum?). Kann mir jemand sagen, was los ist?
Breakpoint 1, 0x080483d2 in main()
(gdb) stepi
0x080483d5 in main()
(gdb) p argc
No symbol "argc" in current context.
(gdb) p argv
No symbol "argv" in current context.
(gdb)