• ベストアンサー

linuxでの実行中のプログラムのトレースの仕方

アスタリスクというlinuxで動作するpbxのオープンソースのC言語のソフトがあります。 アスタリスクを立ち上げたとき、関数がどういう順序で呼び出されているかを調べる必要があります。 そこで、http://www.geekpage.jp/blog/?id=2007/1/17を参考にgdbでアタッチしてみましたが、一部 しか表示されないのででうまくいきませんでした。(全関数の呼び出しを表示するにはメモリ・レジスタが不足と出ました) 実行中の複数のモジュールが絡み合うプログラムの関数の呼び出され方を調べるのに、なにか良い方法がありましたら教えて下さい

noname#182748
noname#182748

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

関数呼び出し順序をチェックしたいだけであれば,straceコマンドを使ってみるのはいかが? 下記はご参考までに. http://sourceforge.jp/magazine/03/10/28/1054253

その他の回答 (1)

  • virdman
  • ベストアンサー率81% (9/11)
回答No.1

アスタリスクというソフトウェアについては知りませんが、プログラムの関数呼び出しをトレースするには ソースコードを見ながら、gdb でトレースする方法が適切かと思います。 tar.gz 等のからインストールされている場合は、アスタリスクをコンパイル時にデバッグシンボルがついていない状態でコンパイルされて可能性があります。 rpm 等からインストールされている場合は、アスタリスクの debuginfo パッケージがインストールされていない可能性があります。(そもそも存在するか知りませんが、なければ tar.gz ファイル内に入っているであろう spec ファイルから rpmbuild -ba コマンドにて生成しても良いと思います。) 質問される際は、ディストリビューション名、バージョン名(CentOS5.6等)は最低でも記載したほうが回答者も回答しやすいと思いますので参考にしてください。 あと、"全関数の呼び出しを表示するにはメモリ・レジスタが不足と出ました"とありますが、実際に出力されたコマンド実行結果やログを記入したほうが適切な回答ができると思います。

関連するQ&A

  • プログラムのトレース

    アスタリスクというlinuxで動作するpbxのオープンソースのC言語のソフトがあります。 アスタリスクを立ち上げたとき、関数がどういう順序で呼び出されているかを調べる必要があります。 そこで、http://www.geekpage.jp/blog/?id=2007/1/17を参考にgdbでアタッチしてみましたが、一部 しか表示されないのででうまくいきませんでした。(全関数の呼び出しを表示するにはメモリ・レジスタが不足と出ました) 実行中の複数のモジュールが絡み合うプログラムの関数の呼び出され方を調べるのに、なにか良い方法がありましたら教えて下さい。

  • Linuxって、、、、、、

    私は現在リナックスを使っているのですが、、、、、 親にリナックスって何?って聞かれると上手く答えられません、 自分自信一体なんのかよくわかってません、 C言語のできるOS?違う、そんなのWindowsでもできる、。 サーバ構築?違う、これもWindowsでもできる、 システム開発用のOS?これもやっぱ違うと思う、他のOSでも できるような気がする、 私が知っているのは、オープンソースとかいうくらい、 自分でいろいろなんか変えられるとか、、、、、 あと友達は「Linuxはカーネルだ!」といっていました、 カーネルは知っているのですが、意味がよくわかりませんでした。 お願いします、Linuxとは一体なんなのですか?

  • リナックス カーネルの c言語ソースについて

    リナックスの質問です。 (超初心者です) カーネルの c言語ソースは どうしたら見られるのでしょうか。 (ウィンドーで) カーネルをネットからダウンロードして、 TAR.BZ2自己解凍モジュールで、解凍しました。 解凍ファイルは いろいろディレクトリーに分かれており、 様々のものがありますが、C言語ソースが見あたりません。 (ファイルを開けてみましたが 何がなにやら、わからないのが正直なところです) と言うより、どれがカーネルの本体かと、謎は深まるばかりです。 日経リナックスムックの 自分で作るリナックスOS で、いろいろ勉強するのですが 「カーネルのソースを見る」 で行き詰まっています。 トンチンカンな質問かもしれませんが、教えてください。

  • C言語のfor文問題で・・・

    C言語のfor文問題で・・・ わからない問題がありまして・・・ アスタリスクを表示させる問題なのですが・・・ わかる方いたら、ソースコードだけでいいので、教えてくだい、お願いします ただし、printfで、全てのアスタリスクを表示させるのはNGで、配列も使ってはいけません。 main関数以外の関数は使わないように、お願いします。 (1)     1段目に*が1つで、 (三角旗型のアスタリスク)       2段目に*が2つで、     3段目に*が3つで、     4段目に*が2つで、     5段目に*が1つ。 (2)   1段目に*が1つで、       2段目に*が3つで、     3段目に*が5つで、    (ダイヤ型のアスタリスク)     4段目に*が3つで、     5段目に*が1つ。     (3)       1段目に*が2つで、   (六角形型のアスタリスク)       2段目に*が4つで、       3段目に*が2つ。     以上3問です。

  • プログラム実行

    下記のプログラムを実行したら、 「警告 W8065 random01.c 15: プロトタイプ宣言のない関数 'strcat' の呼び出し(関数 ma in ) エラー E2342 random01.c 15: パラメータ '__path' は const signed char * 型として 定義されているので int は渡せない(関数 main ) 警告 W8065 random01.c 34: プロトタイプ宣言のない関数 'strcmp' の呼び出し(関数 ma in ) 警告 W8065 random01.c 34: プロトタイプ宣言のない関数 'strcmp' の呼び出し(関数 ma in )」 と表示されました。どこを改善すればうまくいきますか? OSはWinXPでコンパイラはボーランドのフリーコンパイラを使用しています。 #define RECORDLEN 33 #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; char fname[256], data[16], ans[8]; int no; printf("ファイル名"); fp = fopen(strcat(gets(fname), ".txt"), "r"); if (fp == NULL) { perror("ファイルがオープンできません\n"); return -1; } while (1) { printf("何人目のデータを読み込みますか---"); gets(ans); no = atoi(ans); fseek(fp, RECORDLEN * (no - 1), SEEK_SET); if (fscanf(fp, "%s", data) == EOF) { perror("読み込みエラーです\n"); continue; } printf("[氏名] %s", data); fscanf(fp, "%s", data); printf("[電話] %s\n", data); printf("続けますか(y/n): "); gets(ans); if (strcmp(ans, "n") == 0 || strcmp(ans, "N") == 0) break; } fclose(fp); return 0; }

  • Linux環境におけるgetprocs関数

    お疲れ様です、初めてLinux環境で開発(C言語)している者です。 流用元(HP-UX環境/C言語)のソースをコンパイルしたところ、 「getprocs」(プロセス情報の取得?)という関数でエラーになりました。 <procinfo.h>というヘッダをincludeしているのですが、 このヘッダファイルも見当たりません。 Linuxでは、使用できない関数なのでしょうか? また、代替手段などあるのでしょうか? getprocs自体、ネットで調査してもあまり有力な情報をヒットできず、苦慮してます。 ご存じの方おりましたら、ご教授よろしくお願いいたします。

  • このプログラムについてなのですが・・・

    int get_stack_trace(void **result) { void **sp = (void**)&result - 2; // sp[0] : pointer to previous frame // sp[1] : caller address // sp[2] : first argument int n = 0; while (sp && n < 100) { result[n++] = *(sp + 1); void **new_sp = (void**)(*sp); if (!new_sp) break; sp = new_sp; } return n; } 参照サイトhttp://kzk9.net/blog/2006/07/c_1.html このサイトにあるこのソースプログラムを理解し使用したいのですが、私のレベルでは理解できません>< mainがないのですが、このままコピペしても使えないですよね?どうプログラムを付け加えればつかえるようになるのでしょう?(例えばソースを貼ってそのソースで使った関数の流れを表示出来るようにしたいのですが・・。)参照サイトにあるようにアドレスから使用した関数の流れを表示したいのです。欲を言うと、入力した数字の変化も表示できるようにしたいです><お願いします!C言語に詳しい方教えて下さい!><

  • C++プログラムをCで呼び出したい

    こんにちは。質問させていただきます。 現在、Linux/GCC3.2.3系でC言語の開発をしています。 私自身のレベルとしては、C言語での実務は1年未満。C++はゼロ。本業はJavaプログラマを数年やっております。 さっそく本題です。 既にC++で作成されたある一連のプログラム群(20本程度)があり、これらC++の関数をC言語で作成されたプログラムから呼び出して使用したいと思っています。 C++プログラムは既にテスト済みなので、これらのソースは基本的には手を加えず、そのままライブラリ化などして使用したいと考えています。 そこで質問なのですが、C言語から呼び出せるような形式でC++ソースをライブラリ化する方法と、C言語からの呼び出し方を教えていただけないでしょうか?

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

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

  • LINUXでGUIプログラムの作り方を勉強中です

    LINUX(CentOS6.5)でGUIプログラムの作り方を勉強中です GUIツールキットとして、GTK+を使っています。 ツールの導入として、 # yum install gtk2-devel # yum install glade3 を行いました 簡単なサンプルプログラム(以下サンプルと呼ぶ)があったので、そのソースをCompile-Linkし、実行モジュールを作り、これを動かした所、問題なく動きました。そのサンプルには説明書が付いており、その中にdevhelpというツールの使い方も記述されていました。念のため「# yum install devhelp」を実行しましたが、既に導入されているようでした。(Package devhelp-2.28.1-3.el6.i686 already installed ・・・と見える) devhelpを動かし、開いた画面の検索ボックスに「gtk_windows_new」とキーインしましたが、何も参考になる内容が表示されません。但し最初の1文字「g」と打った瞬間には沢山の候補が提示されましたので、機能的には動いているように見えます。ということから中途半端なインストール状態になってしまっているような気がします。 どこを直せば、Window作成関数「gtk_windows_new」の説明が出るのか、見当が付きません。 関係ないかもしれませんが、ちょっと気になるのは(Package devhelp-2.28.1-3.el6.i686 already installed ・・・)の中の「i686」という文字です。動かしているマシンは32ビット機なので「i386」と出た方が自然な気がします・・・・。 識者のアドバイスが頂ければ嬉しいのですが、ご指導のほどよろしくお願い致します。