2016-11-08 7 views
1

Linuxサーバーのコードベースは比較的大きく、起動時にロードされるライブラリとサーバーモジュールは、動的にリンクされています(dlopen())。サーバーと他のコンポーネントのほとんどはC++ 11で書かれていますが、一部はC99に書かれています。メモリ割り当ての失敗に対する適切な動作のテスト

サーバ、その依存関係、およびモジュールがメモリ割り当ての失敗を適切に処理するかどうかをテストするために使用できるアプローチは何ですか? malloc/callocNULLを返し、とnew[]std::bad_allocなどを投げています。割り当ての失敗はstd::string::resize()などです。

以前、私はmemory allocation hooksを使ってメモリ割り当ての失敗をCアプリケーションに注入しようとしましたが、これらはC++では機能しません。私が見なければならない他の選択肢やアプローチは何ですか?

+3

使用 'ulimit':そのCでstd::bad_alloc例外で宣言さmalloc関数結果からNULL戻り++コード

return __libc_malloc(size);割り当てはlibcのmalloc関数によって行われ、出力となるコメントを解除証明0最大データセグメントサイズを制限し、ランダムな割り当ての失敗を強制的に強制します。 –

+0

私は常にvalgrindでテストしています。ランタイムは問題ですが、それはそれだけの価値があります。 – mousomer

+1

CとC++は異なる言語です。問題はすでに広すぎて、そのうちの1人にはあまりにも強く反論されている。 – Olaf

答えて

-1

Linux上で、あなたがやりたいなら

男2 mlockall

mlockall(MCL_CURRENT|MCL_FUTURE);

に失敗する割り当てを強制するために、オペレーティング・システムにフックすることができます。

+0

'mlockall'はそれをしていますか? IMHOはメモリがスワップ領域にページされるのを防ぐだけです。 – jotik

+0

man 2 mlockallは、試したくない場合には確定的なものになります... "mlockall()は、呼び出し元の プロセスのアドレス空間にマップされたすべてのページをロックします。これには、コード、データおよびスタックセグメントのページ、 、共有ライブラリ、ユーザー空間カーネルデータ、共有メモリ、および メモリマップファイルが含まれます。すべてのマップされたページは、呼び出しが成功したときに RAMに常駐することが保証されています。ページは がロックされてからロックされるまで保証されます。 " – Hal

+0

私はまだ' mlockall'がどのように質問に関して助けになるのか理解できません。 – jotik

1

実際には、フックの下でgcc C++のデフォルトのnew演算子newがmallocを呼び出し、gcc互換のソリューションしか必要でないことを確認したので、C mallocにフックするだけで十分です。

私はその簡単なプログラムでそれを証明することができます:

mem.C++:

#include <iostream> 
#include <string> 

class A { 
    int ival; 
    std::string str; 

public: 
    A(int i, std::string s): ival(i), str(s) {} 
    A(): ival(0), str("") {}; 

    int getIval() const { 
     return ival; 
    } 
    std::string getStr() const { 
     return str; 
    } 
}; 

int main() { 
    A a(2, "foo"); 

    std::cout << &a << " : " << a.getIval() << " - " << a.getStr() << std::endl; 

    return 0; 
} 

memhook.c:

#include <stdio.h> 
#include <stdlib.h> 

extern void *__libc_malloc(size_t size); 

void* malloc (size_t size) { 
    fprintf(stderr, "Allocating %u\n", size); 
    return NULL; 
// return __libc_malloc(size); 
} 

NULLを(上記のように)戻って、プログラムを表示:

Allocating 16 
Allocating 100 
terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 
Abandon (core dumped) 
Allocating 16 
0xbfe8d2e8 : 2 - foo 
関連する問題