私はLinux上でgdbバージョン6.8-debianを使用しています。私はcプログラムの主な機能がどのように実行されて遊んでいて、別の場所を見ているのか不思議に思っていましたが、__libc_start_main関数がこれに応答していることがわかりました。 __libc_start_mainへの引数は次のとおりです。mainのアドレス(cからわかるように、パスは常にargv [0]として与えられます)、次にargsはレジスタESIになければなりません。argvの次のアドレスECXで。gdbでコマンドライン引数にアクセス
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
printf("%s: %s\n", "argv[1]", *++argv);
return EXIT_SUCCESS;
}
は、今私はデバッグCMDARGSに起動し、メインにブレークポイントを設定します。
周りに再生するには、私は単に開始時に与えられた最初のコマンドライン引数を出力し、次の簡単なプログラム、cmdargs.cを作っそして__libc_start_main(削除GDBを開始してからの情報):
のgdb CMDARGS
(gdb) b main
Breakpoint 1 at 0x80483d2
(gdb) b __libc_start_main
Breakpoint 2 at 0xb7f3f5a8
(gdb) r qwerty
ここで私は[0]
(gdb) p $esi
と
(gdb) x/s *($ecx)
で期待通りにこれは動作しますが、どのように私は最初の非暗黙的にアクセスします__libc_start_mainにブレークポイント2を押すと、argcとargvのを見ることができますコマンドライン引数 "qwerty"?私はメインとブレークポイントでブレークポイントを継続しようとしましたが、argcとargvは認識されません(なぜ?)。誰かが何が起こっているか教えてもらえますか?
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)