お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2008-10-05 18:28:45

yamadatarou
メンバ
登録日: 2007-05-17

C言語のトレースツール

プログラミングを勉強する上で、プログラムの流れの把握や入力した数字がどのように変化していくのか見ることが出来るツール、ソフトを探しています。Synapticにあるんでしょうか?あるんだとしたらどのような名前で検索すれば分かるのでしょうか?

オフライン

 

#2 2008-10-05 19:02:07

CMasami
拒否
From: Utsunomiya
登録日: 2007-12-13

Re: C言語のトレースツール

※規約違反により追放されたユーザの投稿は、ログインユーザにのみ表示されます。

オフライン

 

#3 2008-10-05 19:21:29

kk
メンバ
From: Hyogo
登録日: 2008-03-30

Re: C言語のトレースツール

CMasamiの言われているとおりなので、
sudo apt-get install build-essential
でgccやら、gdbなどの開発ツールがインストールできます。

ただし、IDEのような環境はインストールされませんので、必要な場合は他の方のフォローを。

オフライン

 

#4 2008-10-05 19:47:30

yamadatarou
メンバ
登録日: 2007-05-17

Re: C言語のトレースツール

#include
#include
#include
#include
#include

#include

bfd* abfd;

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;
}

void
stack_trace(void)
{
    void* trace[100];
    int num_frames = get_stack_trace(trace);

    long storage_needed = bfd_get_symtab_upper_bound(abfd);
    if (storage_needed < 0) {
        fprintf(stderr, "bfd_get_symtab_upper_bound failed\n");
        return;
    }
    if (storage_needed == 0)
        return;

    asymbol **symbol_table = (asymbol**)malloc(storage_needed);
    long num_symbols = bfd_canonicalize_symtab(abfd, symbol_table);
    long i, j;
/*
    for (i = 0; i < num_symbols; i++) {
        asymbol *sym = symbol_table[i];
        printf("%p = %s\n",
               (void*)bfd_asymbol_value(sym),
               bfd_asymbol_name(sym));
    }
*/
    for (i = 0; i < num_frames; i++) {
        void *addr = trace[i];
        asymbol *ret = NULL;
        uintptr_t far = INT_MAX;
        for (j = 0; j < num_symbols; j++) {
            asymbol *sym = symbol_table[j];
            if (bfd_asymbol_value(sym) == 0)
                continue;
            if (bfd_asymbol_name(sym)[0] == '.')
                continue;
            if (addr < ((void*)(uintptr_t)bfd_asymbol_value(sym)))
                continue;
            if (addr - ((void*)(uintptr_t)bfd_asymbol_value(sym)) < far) {
                far = addr - ((void*)(uintptr_t)bfd_asymbol_value(sym));
                ret = sym;
            }
        }

        if (ret)
            printf("%p %15s %p\n",
                   addr,
                   bfd_asymbol_name(ret),
                   (void*)(uintptr_t)bfd_asymbol_value(ret));
    }

    free(symbol_table);
}

int
func2(int n)
{
    if (n == 0) {
        stack_trace();
        return 0;
    }

    return func2(n - 1);
}

void
func1(void)
{
    func2(5);
}

int
main(int argc, char **argv)
{
    abfd = bfd_openr(argv[0], NULL);
    assert(abfd != NULL);
    bfd_check_format(abfd, bfd_object);

    func1();

    bfd_close(abfd);
    return 0;
}

すいません、このソースはgdbと関係あるようなのですが(参照サイトhttp://kzk9.net/blog/2006/07/c_1.html)このソースには何をincludeすればよいのか消えてます(・・;)
お願いします!お手数ですが何をincludeすれば良いのか教えて下さい。欲をいうと入力した数字の変化も追えるよう改良をくわえたいのですが、どうか御助言お願いします><

オフライン

 

#5 2008-10-05 20:45:28

kk
メンバ
From: Hyogo
登録日: 2008-03-30

Re: C言語のトレースツール

ソースに関する問い合わせについては作者の方に聞く方が早いと思いますよ。

#とりあえず、stdio.hは判った。

オフライン

 

#6 2008-10-06 11:08:06

si
メンバ
From: hokkaido kitami, jp
登録日: 2007-01-15

Re: C言語のトレースツール

ソースコードを貼るときは、

コード:

[CODE]
#include <stdio.h>
[\CODE]

の様に、半角の [CODE]と[\CODE]で囲みます。

オフライン

 

#7 2008-10-06 13:39:32

tani
メンバ
登録日: 2006-10-20

Re: C言語のトレースツール

元ページの画面上からは消えちゃってますがHTMLを確認するとincludeされてるのは

stdio.h
stdlib.h
assert.h
limits.h
stdint.h

bfd.h

ですね。

オフライン

 

#8 2008-10-06 17:55:07

RxOrca
メンバ
登録日: 2007-03-02

Re: C言語のトレースツール

Firefoxであれば, 該当する範囲を選択 (反転) させておいて, 「選択した部分のソースを表示」するとよいカモです。
(そしたら何が書かれてるのか分かる)

つか kkさんのゆーとーり, 作者さんに伝えた方がよいカモ。

オフライン

 

Board footer

Powered by FluxBB