0

私はポインターで遊んでいて、それらの理解を固めるためにいくつかの基本的なことをしているだけです。GDBの「next」と「step」を使用してWebで見つけたこの例をデバッグして従うと、GDBは関数の最後から実行されます。ステートメント「return0;」に達した後。「start()のアドレス0x00x0000000100000de4のメモリにアクセスできません。

これはコードです:

#include <cstdio>
#include <ctype.h>


int main()
{
    char my_str[] = "hello world";
    *my_str = toupper(*my_str);
    *(my_str + 6) = toupper(*(my_str + 6));
    printf("%s", my_str); // prints, "Hello World"
    return 0;
}

これはgdbの出力です:

Breakpoint 1, main () at pwp.cpp:10
10       return 0;
(gdb) n
Cannot access memory at address 0x0
0x0000000100000de4 in start ()
(gdb) s
Single stepping until exit from function start, 
which has no line number information.
0x0000000100000ed6 in dyld_stub_exit ()
(gdb) n
Single stepping until exit from function dyld_stub_exit, 
which has no line number information.
0x0000000100000f08 in dyld_stub_printf ()
(gdb) n
Cannot find bounds of current function
(gdb) q

これを引き起こすために何が起こっているのですか?

4

1 に答える 1

1

から戻るとmain()、プログラムがすぐに終了するわけではありません。libcは、終了する前にクリーンアップを実行します。これには、などのファイル記述子の出力のフラッシュが含まれます(stdoutにを含めなかったため、ここで必要です)。\nprintf

GDBのnコマンドは、デフォルトで1行のソースコードをステップ実行しようとします。(libc)に使用できるソースがないコードにシングルステップインしているため、またステップインしているコードがやや奇妙であるため(ダイナミックライブラリの「スタブ」関数)、コマンドは機能しません。正しく。本当に一度に1つの命令をステップ実行する場合は、を使用しますsi

于 2012-09-19T18:34:54.517 に答える