アプリケーションはメモリページの送信を明示的に制御できますか?数年前、私はWindowsアプリケーションでランダムなハング参照/ヒープ破損エラーを見つけるのに役立つ「警告システム」ヒープマネージャを作成しました。広い仮想メモリ領域を予約し、必要に応じてページをコミット/コミット解除できます。アイデアは、コミットされていないページと1つ以上のコミットされたページ(要求を満たすのに十分です)を含むコレクションを作成し、最後にコミットされていない別のページを使用して、呼び出し元に返されたポインタが場所にあるかどうかを制御します。することです。コミットされた領域の開始または終了(各引数または上書き時にすぐに例外がトリガーされる)Windowsは、メモリ領域を予約し、ページをコミットするためのAPIを提供します。私が書いているLinuxプログラムには、これらのブックエンドバッファの別の目的がありますが、カーネルが同じ種類の機能を提供しているのかどうか疑問に思います。
答え1
私の考えでは、あなたが言っていると思います。VirtualAlloc
そして友達。私が知っている限り、Linuxには直接同等の機能はありませんが、いくつかの方法で同じ効果を得ることができます。メモリを予約するには、次のものを使用できます。mmap(2)
;コミットするには作成する必要があり、アンロードするには次のものを使用できます。madvise(2)
のMADV_DONTNEED
。
保護されたページを実装するには、次を見つけることができます。mprotect(2)
ハンドラと一緒に行く方が良い選択になりますSIGSEGV
。また、コンパイラが提供するオーバーフロー防止(-fstack-protector
そして何よりもさまざまな-fsanitize
オプション)を見ることもできます。
答え2
複雑なメモリマネージャを実装するのではなく、独自のプログラムをデバッグしたい場合は、次のようなものを使用することをお勧めします。ウォールグリーンメモリリークとぶら下がったポインタを検出します。