6

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によって作成された、またはcalloclibcによって呼び出された変数を監視すると、このスペースはそれらによって使用されません。それらは、そのアドレス範囲 (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);

それを手伝ってください。私はそれについて本当に混乱しています。

4

1 に答える 1

4

スレッドにスタック領域を割り当てているようです。
このスペースは、スレッドで関数呼び出しを行うときに使用されます。

しかし、実際に何をしているのかは、あなたには関係ありません。pthread_create()それは、そこで好きなことを何でもできる内部実装の一部です。

于 2012-12-12T23:27:04.643 に答える