デバックをしている時に、メモリやスタックなどちゃんと開放されているかを確認したいのですが、よくわかりません。
GlobalMemoryStatus関数で取得した値を見ているんですが、
起動するたびにスワップファイルが減っていくのですが、これは開放されていないものがあるってことですか?
それにぴったりのユニットが
http://www.yks.ne.jp/~hori/MemCheck.html
ここにあります。
GlobalMemoryStatus関数は、システム全体の状態を返すんだと思います。
だとすれば、プロジェクトで使っているメモリだけを監視することはできません。
にしのさん ありがとうございます。
ためしに使ってみたのですが、(DLした物に入っていたサンプル)
[警告] CmdCnter.dpr(25): シンボル 'ExceptionRecord' はプラットフォームに依存すると宣言されています
[エラー] CmdCnter.dpr(39): 'MemCheck.PExceptionRecord' と 'Project1.PExceptionRecord' には互換性がありません
と表示されます。
どうしたら使えるようになるのでしょう?
> [警告] CmdCnter.dpr(25):
> [エラー] CmdCnter.dpr(39):
名前が間違ってしまいました。ここはProject1です。
> 〜 'Project1.PExceptionRecord' には互換性がありません
逆にこっちを直してもいいんですけど・・
Delphi6Personalなんですけど、あのサンプル、どうやっても使えませんでした。
警告は無視しても動くからいいとして。
MemCheckモジュール自体は正常に使えるので、
サンプルは参考にせずに、MemCheckモジュールを使っちゃえばいいです。
たかみちえさん ありがとうございます。
> サンプルは参考にせずに、MemCheckモジュールを使っちゃえばいいです。
使ったのですが、出るんですよ。
メモリリークの方だけだと使えるのですが、
どれが開放されているかがわかる方(?)を使いたいのですが
そのためには、エラーを回避しないといけないわけなのです。
こんにちは、ToshiqnZです。
実は、私も使ってまして以下の様にすると上手くいきました。
//略
{$R *.res}
{procedure GetExceptInfoFunc(Obj: TObject; var Message: string; var ExceptionRecord: PExceptionRecord);
begin
if Obj is Exception then
begin
Message := Exception(Obj).Message;
if Obj is EExternal then
ExceptionRecord := EExternal(Obj).ExceptionRecord;
end;
end;
procedure SetExceptMessageFunc(Obj: TObject; const NewMessage: string);
begin
if Obj is Exception then
Exception(Obj).Message := NewMessage;
end;}
begin
// 例外ハンドラをインストール
// なぜ MemCheck ユニット内でやらないかというと、MemCheck ユニットが
// SysUtils ユニットよりも先にリンクされる必要があるため。
//MemCheckInstallExceptionHandler(GetExceptInfoFunc, SetExceptMessageFunc);
Application.Initialize;
//略
MemCheckInstall...をコメントアウトでOKでした。
参考になるかな。
ToshiqnZさん ありがとうございます。
実行できました。
大変なことになってました。
4つも開放し忘れていた・・・
早めに気づいてよかったです。
ありがとうございました。
解決マーク付け忘れました。;_;
ツイート | ![]() |