• 締切済み

GDBでデバッグするとき文字列の中身見れますか?

Cでプログラムを書いたんですけど、コンパイルは通るが実行すると「セグメンテーション違反です」と出ます。 そこでGDBを用いてデバッグをかけましたけど文字列の中身の見方が分かりません。 つまり、p i とすれば、いまの i の値を出力しますけど、どうすれば文字列 word の中身を見せてくれるか教えてください。 よろしくお願いします。

みんなの回答

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

No.1 です。 どうやら gdb が2バイト文字を認識していないようですね。 「wordの中には日本語の単語」とのことですが、私は日本語の文字列を扱ったことがないので、gdb で日本語を表示できるかどうかは知りません。

yamanashij
質問者

お礼

回答ありがとうございました。

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.1

char *word = "abc"; あるいは char word[] = "abc": とかなっていたら gdb> p word abc gdb> というように文字列の中身が表示されると思います。

yamanashij
質問者

補足

回答ありがとうございます。 wordの中には日本語の単語が入ってるんですけど、gdb> p word と入力すると (gdb) p word $5 = "\\000\203?\202?000\000\000\000\020\000\000?\032\000М006 のように出力されます。 OSがFEDORAなんですけど、OSのせいでしょうかね?

関連するQ&A

  • gdbを使ったデバッグの方法について

    Linux環境でC言語プログラムを開発している者です。 デバッグをgdbで行おうと思っているのですが、-gオプションを付けてgdb ./a.out でCの実行モジュールを使ったデバッグは行ったことはあるのですが、以下のようなshellスクリプト内で環境変数の設定を行い、設定した環境変数下で./a.out内にbreakポイントを設定するにはどうすればいいのでしょうか?ご教授お願いします。 Test.shの内容 #!/bin/sh export ftn22=’/home/test’ ./a.out Cの実行モジュール

  • 文字列が結合できません。

    こんにちわ。 質問させてください。 セル(I7)に値が入っており、それに文字列を加えたいのですが、 うまくできません。 I7の中身:(1 プログラム: ActiveSheet.Range("I7") = ActiveSheet.Range("I7").value & ")" これを実行し、(1)がセルに入力されてほしいのですが、 -1が入力されてしまいます。 どなたか回答よろしくお願いします。

  • リモートデバッグについて

    リモートデバッグについて質問があります。 現在、Red Hat Linux 9.0にて、C言語のプログラミングをしています。 いま作っているプログラムは、CUIの簡単なものです。 環境は以下のとおりです。  エディタ :vi  コンパイラ:gcc  デバッガ :gdb ですが、viに慣れていないのとgdbだとデバッグは全てコマンドになるので、 効率が上がらないです。(スキルも無いのですが。) そこでWindowsXPのマシンで、samba共有のソースをエディタで 編集してみると便利でした(パソコンは2台あります) ただ、コンパイルとデバッグはLinux上になってしまうので、そこから先は同じです。。。 WindowsマシンでLinuxに入っているgdbのフロントエンドみたいなことできないでしょうか? (コンパイル・実行は、Linux上で行われるけど、デバッグは、Windowsから行える) 何か、いい環境はありませんでしょうか? また可能であれば、手順等をお教えいただけますか? ※ちなみにLinuxマシンは、中古の5000円で購入したボロの為、Xウインドウを入れていないです。  なので、GUIの統合環境をLinuxマシンで使用するというのは無しでお願いします。  また、windowsマシンにcygwinを入れるというのもLinuxマシンが可哀想なので、  今回は無しでお願いします。 下記のアドレスにあるソフトを使うと私のしたいことが出来るような気がするのですが、 英語のページなので、細かいところがわかりません。。。 BVRDE http://bvrde.sourceforge.net/index.htm

  • VB6.0でデバッグ時、文字列の値をコピーしきれない

    VB6.0のデバッグで、文字列の値をコピーしようとする時、 値が長すぎると、コピーしきれなくて、困っています。 解決方法がありますでしょうか?

  • セグメンテーション違反について

    C言語であるプログラムを作っています。コンパイルは上手くできるのですが、実行するとセグメンテーション違反と出てしまいます。それもセグメンテーション違反と出るときと出ないときがあり困っています。そこでプログラム中のどこがセグメンテーション違反を指しているのか知りたいのですが、何かセグメンテーション違反の場所を教えてくれるようなオプションはないでしょうか? プログラムソースを見てもらうのが一番いいと思いますが、行数が1000行を超えているので断念しました。OSはLinuxでコンパイラはgccです。どなたかご教授お願いします。

  • セグメンテーション違反について

    現在、FORTRANを使ってプログラミングを行っています。 プログラムを作って、コンパイルまではうまくいき、いざファイルを実行してみると、「セグメンテーション違反です」という文字が出てしまいました。 いったい何が原因でそのような現象が起こってしまったのでしょうか。 ご教授願えればと思います。

  • arm-linux-gdbをMeadowで使う方法ありますか?

    Cを書くのに、GDB + Meadowを使い始めました。 今回、arm-linux-gccで、組込み用のプログラムをクロスコンパイルしています。そこで、M-x gdbのような感じで、arm-linux-gdbをMeadow上で使うことはできますでしょうか?(例えば、M-x arm-linux-gdb みたいな)やり方、もしくは、参考になるサイトがあればお教えください。 ちなみに、現段階では、gdbserverをターゲットに置いて、arm-linux-gdbをCygwin上から直接起動してデバッグすることには成功しております。Cygwin暦はそれなりにあるのですが、emacs関連の知識は最近始めたばかりで、ほぼ初心者レベルです。よろしくお願いいたします。

  • 文字列から空白を取り除きたいのですが

    C言語を勉強しはじめて間もない者です。 文字列から空白を取り除く(空白は左に詰めることで埋める)処理をしたいのですが、下記のようなやり方でうまくできなくて困っています。 ↓を実行すると" 1234"なら"12344"になるはずだったのですが、うまくいきません。何がおかしいのでしょうか?? よろしければご教授願います。 ※文字列は半角のみ想定しています。 int i = 0; char str[] = " 1 23 4 5"; char *p; p = str;   while( *p != '\0' ){     if ( isspace(*p) != 0 ){       while( *(p + i + 1) != '\0' ){         *(p + i) = *(p + i + 1);         i++;       }     }     p++;   }  

  • デバッグセッションの実行可能ファイル

    Visual C++ 2008 Express EditionでC言語のプログラムをコンパイルし、エラーも警告も出ないので、デバッグ(実行)を行ったところ、 「デバッグセッションの実行可能ファイル」を選択する画面に移りましたが、何を設定したらよいのかさっぱりわかりません。 プログラムは単純なものなので、特にややこしいことはないと思うのですが・・・

  • ポインタと文字列

    最近やっとポインタを理解できるようになってしきました。 でも、ちょっとわからない問題があるので質問させていただきます。 問)a~z,A~Z及び,.?空白などで構成される文字列を入力して、大文字と小文字を区別しないでa~zの出現頻度をポインタを使ってそれぞれ表しなさい。 ※文字列のほうはこちらで用意させていただきました。リダイレクトを使用してください。単語数は250です。 http://ayumuatsuco.fc2web.com/mit.htm 一応途中まで作ってある私のプログラムを参考にしてみてください。実行結果が変ですが。。。 #include <stdio.h> int main(void) { char buffer[250], hindo[26], *p; int i; while(1){ if(gets(buffer)==NULL) break; p=buffer; while(*p!='\0'){ hindo[*p-'a']++; for(i=0; i<10; i++){ if('a'<=*(p+i)) *(p+i)=*(p+i)-32 } for(i=0; i<26; i++){ printf("hindo[%d]=%d\n",i,*(p+i)); } } } return 0; }

専門家に質問してみよう