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:gdb と 1000speakers は全く関係ない