C言語関係掲示板

過去ログ

No.65. デバッグコード用の前処理と後処理


以前shuさんに教えてもらったHPに、「自分のヘッダを作って使いまわすといい」
というようなことが書いてあったのをみて、なるほどと思って今作っています。
で、いい実現方法が見つからない部分があるので助言いただけないでしょうか。

やりたいことなのですが、DEBUGが定義されていると、たとえば、
#ifndef DEBUG
#define malloc(size) malloc(size)
#define free(block)  free(block)
#else
#include "debug.h"
#define malloc(size) dbg_malloc(size, __FILE__, __LINE__)
#define free(block)  dbg_free(block, sizeof(block), __FILE__, __LINE__)
#endif
のようにデバッグコードつきの関数に置き換わるのですが、
このデバッグ関数群の前処理と後処理をしたいのです。
プリプロセッサを巧みに操ればなんとかなると思っていたのですが、いい方法が思いつきません。

プリプロセッサを使って、
int main(void)
{
        printf("hello\n");
        return 0;
}
というコードを、
int Main(void)
{
        printf("hello\n");
        return 0;
}
int main(void)
{
        int r;
        dbg_init("debug.log", __DATE__, __TIME__);
        r = Main();
        dbg_report();
        return r;
}
と置き換えてやろうと思っていたのですが今のところうまくいってません。


>プリプロセッサを巧みに操ればなんとかなると思っていたのですが、いい方法>が思いつきません。

プリプロセッサにもいろいろあるので、ここなんか参考してみてはどうでしょう。

Load to...
http://www.geocities.co.jp/SiliconValley-Bay/8490/
内の Programing > C言語入門の step63 〜 66です。
C言語入門


投稿してから気づいたんですが無駄なとこと変なとこがありました。
以下のように読みかえてくださいませ。
---
#ifndef DEBUG
#define malloc(size) malloc(size)
#define free(block)  free(block)
#else
#include "debug.h"
#define malloc(size) dbg_malloc(size, __FILE__, __LINE__)
#define free(block)  dbg_free(block, sizeof(block), __FILE__, __LINE__)
#endif
↓
#ifdef DEBUG
#include "debug.h"
#define malloc(size) dbg_malloc(size, __FILE__, __LINE__)
#define free(block)  dbg_free(block, __FILE__, __LINE__)
#endif
---
int main(void)
{
        int r;
        dbg_init("debug.log", __DATE__, __TIME__);
↓
#include <time.h>
int main(void)
{
        int r;
        dbg_init("debug.log", time(NULL));
---


一番初めに
#define DEBUG
が足りないんじゃないでしょうか


良く見てみたら質問の答えになってませんでしたね。
#ifdef DEBUG
#include "debug.h"
#else
#include <stdlib.h>
#endif

stdlib.hの部分はmalloc()とfree()が入っているヘッダ
でOKなんじゃないでしょうか。


こんにちは、ともじです。

chu-さんのやりたいこと、一応わかったのですが、プリプロセッサでやるのって、
難しいですよね。ちょっと、思いつきませんでした。

dbg_init() と dbg_report() の具体的な処理がわからないので、なんですが、
仮に、dbg_init() で開始時間をデバッグファイルに登録、dbg_report() で
デバッグファイルの出力と仮定すると、この二つの処理だけ別プログラムにして、
主プログラムをsystem()で呼ぶ、なんていうのはどうでしょうか。


>shuさん
こちらの意図がうまく伝わらなかったようで申し訳ありませんでした。

>ともじさん
> dbg_init() と dbg_report() の具体的な処理がわからないので、なんですが、
dbg_initではデバッグ用関数群で使う変数の初期化やメモリ確保等を行おうと考えています。
dbg_reportではメモリの開放やレポート出力等で考えています。
> 別プログラムにして、主プログラムをsystem()で呼ぶ、なんていうのはどうでしょうか。
できればmain関数にはなんのコードも付け加えることなく、コンパイルオプションで
DEBUGを指定するだけでOKなようにしておきたいんです。

一応それっぽものができたので載せておきます。
でもmain関数の宣言が固定されてしまってるのがなんだか不満です。
int main(void)やvoid main(void)等でも大丈夫な汎用性のあるものはできないでしょうか。

↓今のところメモリ関連のみです。なんか穴がありそうですが。
http://www.geocities.jp/chu900rr/program/source/cstddef.zip

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.11.15
Copyright(c) 2000-2002 TOMOJI All Rights Reserved