すがブロ

sugamasaoのhatenablogだよ

GDBを使ってみる(2)

GDB でポインタとか覗きたい覗きたい!

サンプルとしてこんなプログラムを作った。これを作るだけで30分以上掛かったおれ涙目*1

  1 #include <stdio.h>
  2 
  3 void copy(char* string, char* out) {
  4  int i;
  5  for (i = 0; *(string+i) != '\0'; i++) {
  6   *(out + i) = *(string + i);
  7  }
  8 }
  9 
 10 
 11 int main(void) {
 12   char string[] = "hello! hogehoge!";
 13   char out[255] = {'\0'};
 14 
 15   printf("before:%s\n", string);
 16   copy(string, out);
 17   printf("after:%s\n", out);
 18 
 19   return 0;
 20 }

コンパイルして gdbデバッグしてみる。
ちなみに、 vim だと :!gcc -g % でコンパイルできる。というか、: の後に !コマンド でシェルのコマンドを叩ける。

(gdb) break main
Breakpoint 1 at 0x1f46: file reverse.c, line 12.
(gdb) r
Starting program: /private/tmp/a.out 
Reading symbols for shared libraries ++. done

Breakpoint 1, main () at reverse.c:12
12        char string[] = "hello! hogehoge!";
(gdb) n
13        char out[255] = {'\0'};

とりあえず string を見てみよう。

(gdb) p string
$1 = "hello! hogehoge!"

おぉ、普通に見れた。
じゃあ、こうするとどうだ?

(gdb) p *string
$2 = 104 'h'

ふむ。先頭アドレスの値ということか。じゃあ、こうすれば二番目も取れる?

(gdb) p *(string+1)
$4 = 101 'e'

おぉ、考えた通りだ。
そういやアドレスってどうなってるんだっけ。 char だと 1byte なんだっけか? 先頭と二番目でアドレスの値がどう変化するか見てみよう。

(gdb) p &string
$16 = (char (*)[17]) 0xbfffefbf
(gdb) p &string[0]
$17 = 0xbfffefbf "hello! hogehoge!"
(gdb) p &string[1]
$18 = 0xbfffefc0 "ello! hogehoge!"

なんかちょっと予想と違ったな。でも、添字でアクセスすると 1byte ずつ増えてるようだ。

というわけで

ポインタで渡してもそれなりに見えるようだ。
っていうか、そんな事より、C言語めんどくSEEEEEEEEEE!!!
文字列のコピーくらい配列の = でなんとかさせてくれ\(^o^)/

そして

1000speakers の準備は全く進まないのであった/(^o^)\*2

*1:一応書いておくけど、関数作るような C 言語プログラムは一年ぶり? くらいだし!><

*2:gdb1000speakers は全く関係ない