6

CentOS 5.5 コンピューターで ac プログラムを実行しています。プログラムは、外部ソースから停止するように指示されるまで、何度もテストを実行するループを実行します。

必然的に、テスト システムと通信する PCI カードに古いドライバーを使用しています。CentOS 4.5 から 5.5 にアップグレードしてから、プログラムを 175 回しかループできないことに気付きました。その時点で、プログラムはヒープ メモリの割り当てエラーで停止します。プログラムがループしてシステムがメモリ不足になるたびに、メモリが 10 ~ 20 MB のチャンクで使用されていることがわかります。Cntrl-C を使用してプログラムを終了すると、メモリはすぐに解放されます。

メモリ リークが古いドライバーにあることを示す Valgrind を使用しました。ドライバーを作成した会社は、現在 Windows のみをサポートしており、ドライバーを 5 年以上アップグレードしていません。

ソースコードがなければ、プログラムをループするたびにドライバーが使用するメモリを解放する方法はありますか?

ありがとう。

4

5 に答える 5

2

Valgrind がリークしている割り当てがドライバー コード内で行われていることを示している場合でも、問題はまだコード内にある可能性がありますこれは、たとえば、プログラムが呼び出すことを期待する「フリー」または「リリース」タイプの関数をドライバーが提供し、それを行っていない場合に発生します。

于 2010-11-16T01:10:54.893 に答える
2

ループ内のドライバーを介してテスト システムへのアクセスを宣言すると、反復ごとに範囲外になります。

次のようなもの:

char readbuf[512];
for (int i = 0; i < countloops; i++) 
{
   int fd = open("/dev/com1", O_RDWR);
   readbuf = read(fd, sizeof (readbuf));
   close (fd);
}
于 2010-11-15T18:41:12.863 に答える
1

ドライバーを N 回使用するたびに新しいプロセスを作成し (最大 175 個が機能するはずです)、任意の種類の IPC を介して親プロセスと通信します。

于 2010-11-15T19:27:03.990 に答える
0

ドライバーは自己完結型のコンポーネントとして提供されますか、それとも CRT にリンクするライブラリですか? 後者の場合、つまり、それ自体を提供するのではなく、malloc() にリンクすることを期待している場合、独自の実装に強制的にリンクさせることで、使用する malloc() をオーバーライドできます。それが完了したら、そのヒープを制御し、プロセスを強制終了することなくドライバーを「再起動」できます。

これはまさに、消費者向け製品にリンクするために必要な特定の漏れやすいサードパーティ ライブラリに対処した方法です。

于 2010-11-16T01:16:55.550 に答える
0

うーん!難しいもの、...

独自のメモリ管理を作成し、ネイティブ OS 管理をラップして、古いドライバーをそれにリンクできますか? できるかどうかは正直わかりません。

また、このドライバーを作成した会社に問題を説明し、古いコードをうまく提供してもらうこともできます。

頑張って=/

于 2010-11-15T18:41:12.787 に答える