質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.26%

  • C

    2669questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • GDB

    12questions

    GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

gdbのアドレスの結果が一致していない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 88

strike1217

score 492

#include<stdio.h>
#include<string.h>

int main(){
    char str[] = "you will make me happy\n";

    printf("%s", str);

    for(int i = 0; i < strlen(str) - 1; i++){
        printf("str[%d] : %c : %p\n", i, str[i], &str[i]);
    }

    return 0;
}


結果を一部載せます。

str[0] : y : 0x7fffffffd530
str[1] : o : 0x7fffffffd531
str[2] : u : 0x7fffffffd532
str[3] :   : 0x7fffffffd533
str[4] : w : 0x7fffffffd534
str[5] : i : 0x7fffffffd535
str[6] : l : 0x7fffffffd536

次にgdbでスタック領域を覗いてみます。

(gdb) x/30x $rsp
0x7fffffffd4f0:    0x20756f79    0x6c6c6977    0x6b616d20    0x656d2065

これは・・・最初の 'y' 0x79 が0x7ffffffffd4f3の位置にあるようですが・・・
0x7fffffffd5300x7ffffffffd4f3とかなり差があります。
おまけに、0x7ffffffffd4f0 の小さいアドレスの方に、スペース 0x20 が入っていますよね??

どういうことでしょうか?gdbの結果がよくわかりません。
これ、gdbは内部のメモリのリトルエンディアンを自動で元に戻して表示しているんでしょうか??

わかる方いますか??
ALSRは無効にしています。
Linux 64bit debain GCC です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

>これ、gdbは内部のメモリのリトルエンディアンを自動で元に戻して表示しているんでしょうか??
「4バイト整数としてreadした値を16進数で表示」の結果ですね。
リトルエンディアンでintが4バイトの場合は、C言語で
printf("*(int*) %x\n", *((int*)str));
でも20756f79になるでしょう。

gdbでは、
(gdb) x/8bx (アドレス)

(gdb) x/2wx (アドレス)
のような形式で見比べたら良いと思います。

>0x7fffffffd530と0x7ffffffffd4f3とかなり差があります。
('y'の位置は0x7ffffffffd4f3ではなく0x7ffffffffd4f0ですが、それは別として)最初の実行結果はgdbからではなく直接実行、だとすれば特におかしい結果ではないと思います。実行環境が異なるので。

gdbから実行して、printfの結果が出てからmain関数終了までの間にxコマンドで確認すれば一致しているはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/17 20:31

    GDBで実行と直接実行するのでは、結果が違う・・・ということですか??

    キャンセル

  • 2017/12/17 20:35

    GDBでは、メモリやレジスタ内部をそのまま表示している・・・と考えてよいんでしょうか?

    キャンセル

  • 2017/12/17 21:45

    gdbが内部で具体的にどういうことをやっているか、シェルからの直接実行との環境の違いを語れるような知識は持ち合わせていません。
    が、「実行方法が違えば、全く同じ環境というわけではないだろうなあ」という想像はできます。
    gdbから実行している最中の情報としては正しいけど、違う方法で実行した場合とはアドレスまで一致することを期待するべきではないのではないでしょうか。

    実行方法による差異を減らす1つの方法。
    gdbでattachコマンドを使うと、既に実行中のプロセスの情報を見ることが可能です。
    ただし、この質問のプログラムそのままでは実行してすぐに終了してしまうので、そうならないような加工が必要です。

    キャンセル

  • 2017/12/17 21:47

    なるほど!
    ありがとうございます。

    キャンセル

  • 2017/12/17 22:15

    すいません。アセンブリ言語のmov命令って転送する際に「リトルエンディアンに変換して転送」するのでしょうか?
    それともそのままで転送するんですか?

    キャンセル

  • 2017/12/17 22:43

    リトルエンディアンのCPUの場合は、1バイトごとに区切ったアドレスの小さいほうが下位バイト、大きいほうが上位バイトになるでしょうね。
    「変換」ではなく、それがリトルエンディアンのCPUにとっての「平常運転」です。
    リトルエンディアンで書かれたデータを人間が読もうとすると、「変換」に思えるかもしれません。

    キャンセル

  • 2017/12/17 23:02 編集

    例えば、movabs $0x6c6c697720756f79,%rax

    となっていたとき、%raxの中は、0x796f752077696c6c とリトルエンディアンになるのでしょうか?

    キャンセル

  • 2017/12/17 23:09

    それは0x79(途中省略)6cではなく、0x6c6c697720756f79になっているはず……

    キャンセル

  • 2017/12/17 23:11

    そうですよね!!
    ほっ・・・

    わかりました。ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.26%

関連した質問

同じタグがついた質問を見る

  • C

    2669questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • GDB

    12questions

    GDBはGNUソフトウェアシステムのための標準的なデバッガーです。