new
のオペレータに問題がありますlibstdc++
。C++ でプログラムを作成しましたが、メモリ管理に問題がありました。
私のRAMを食べているものを特定するためにgdbでデバッグした後、私は次のようになりましたinfo proc mappings
Mapped address spaces:
Start Addr End Addr Size Offset objfile
0x400000 0x404000 0x4000 0 /home/sebastian/Developement/powerserverplus-svn/psp-job-distributor/Release/psp-job-distributor
0x604000 0x605000 0x1000 0x4000 /home/sebastian/Developement/powerserverplus-svn/psp-job-distributor/Release/psp-job-distributor
0x605000 0x626000 0x21000 0 [heap]
0x7ffff0000000 0x7ffff0021000 0x21000 0
0x7ffff0021000 0x7ffff4000000 0x3fdf000 0
0x7ffff6c7f000 0x7ffff6c80000 0x1000 0
0x7ffff6c80000 0x7ffff6c83000 0x3000 0
0x7ffff6c83000 0x7ffff6c84000 0x1000 0
0x7ffff6c84000 0x7ffff6c87000 0x3000 0
0x7ffff6c87000 0x7ffff6c88000 0x1000 0
0x7ffff6c88000 0x7ffff6c8b000 0x3000 0
0x7ffff6c8b000 0x7ffff6c8c000 0x1000 0
0x7ffff6c8c000 0x7ffff6c8f000 0x3000 0
0x7ffff6c8f000 0x7ffff6e0f000 0x180000 0 /lib/x86_64-linux-gnu/libc-2.13.so
0x7ffff6e0f000 0x7ffff700f000 0x200000 0x180000 /lib/x86_64-linux-gnu/libc-2.13.so
0x7ffff700f000 0x7ffff7013000 0x4000 0x180000 /lib/x86_64-linux-gnu/libc-2.13.so
0x7ffff7013000 0x7ffff7014000 0x1000 0x184000 /lib/x86_64-linux-gnu/libc-2.13.so
そこから切り取っただけです。しかし、すべてが正常です。これの一部は標準ライブラリのコードに属し、一部はヒープであり、一部は私が作成したスレッドのスタック セクションです。
しかし。なぜそれが割り当てられているのかわかりません:
0x7ffff0000000 0x7ffff0021000 0x21000 0
0x7ffff0021000 0x7ffff4000000 0x3fdf000 0
これらの 2 つのセクションは、一見ランダムなタイミングで作成されます。時間的にも、特定の作成されたスレッドなどでも、数時間のデバッグがあります。でハードウェア ウォッチ ポイントを設定し、再びawatch *0x7ffff0000000
数秒間与えましrun
た。
これらの 2 つのセクションは、デバッグ不可能な関数の同じコード セクション内でほぼ同時に作成されます (gdb はスタックに として表示しますin ?? () from /lib/x86_64-linux-gnu/libc.so.6
)。より正確には、これが発生したサンプル スタックです。
#0 0x00007ffff6d091d5 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff6d0b2bd in calloc () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff7dee28f in _dl_allocate_tls () from /lib64/ld-linux-x86-64.so.2
#3 0x00007ffff77c0484 in pthread_create@@GLIBC_2.2.5 () from /lib/x86_64-linux-gnu/libpthread.so.0
#4 0x00007ffff79d670e in Thread::start (this=0x6077c0) at ../src/Thread.cpp:42
#5 0x000000000040193d in MultiThreadedServer<JobDistributionServer_Thread>::Main (this=0x7fffffffe170) at /home/sebastian/Developement/powerserverplus-svn/mtserversock/src/MultiThreadedServer.hpp:55
#6 0x0000000000401601 in main (argc=1, argv=0x7fffffffe298) at ../src/main.cpp:29
別の例を次に示します (別の実行から)。
#0 0x00007ffff6d091d5 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff6d0bc2d in malloc () from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00007ffff751607d in operator new(unsigned long) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x000000000040191b in MultiThreadedServer<JobDistributionServer_Thread>::Main (this=0x7fffffffe170) at /home/sebastian/Developement/powerserverplus-svn/mtserversock/src/MultiThreadedServer.hpp:53
#4 0x0000000000401601 in main (argc=1, argv=0x7fffffffe298) at ../src/main.cpp:29
全体としてcalloc
、pthread lib から呼び出されたときに発生するか、別の状況でそれが呼び出されたnew operator
か、malloc
そこから呼び出されたことが示されています。それが何であるかは関係ありませんnew
-いくつかの実行では、コード内のほぼすべてnew
またはスレッドの作成で発生しました。それに関する唯一の「一定の」ことは、 で毎回発生することlibc.so.6
です。
コードのどの時点でも、malloc または calloc と一緒に使用されて
も、プログラムが実行された後で
も、スレッドがいくつ作成された後
でも、常にそのセクション: 0x7ffff0000000 - 0x7ffff4000000 です。
プログラムが実行されるたびに。しかし、毎回プログラムの別の時点で。67MB の仮想空間を割り当てたのに使っていないので、本当に混乱しています。malloc
そこに作成された変数、特にlibcによって作成された、またはcalloc
libcによって呼び出された変数を監視すると、このスペースはそれらによって使用されません。それらは、そのアドレス範囲 (0x7ffff0000000 - 0x7ffff4000000) から遠く離れたヒープ セクションに作成されます。
編集:
親プロセスのスタック サイズも確認したところ、使用量は 8388608 バイトで、0x800000 (~8MB) でした。これらの値を取得するには、次のことを行いました。
pthread_attr_t attr;
size_t stacksize;
struct rlimit rlim;
pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
getrlimit(RLIMIT_STACK, &rlim);
fit into a size_t variable. */
printf("Resource limit: %zd\n", (size_t) rlim.rlim_cur);
printf("Stacksize: %zd\n", stacksize);
pthread_attr_destroy(&attr);
それを手伝ってください。私はそれについて本当に混乱しています。