2

IP 上の理由から、実際のコードを投稿することはできませんが、要点は次のとおりです。

 ...
 double valueA = 0.0;
 double valueB = 0.0;
 section_t * section = &some_global_table[counter].section;
 if (NULL == section) continue;
 else
 {
      for (subsecnum = 0; subsecnum < section->entries; subsecnum++)
      {
          valueA = (double) section->subsection[subsecnum].value //CRASHES HERE
          valueB = (double) section->subsection[subsecnum+1].value; // subsecnum + 1 is a valid entry
          ...//do something with values//...
      }
 }
 ...

上記のコードは、必要なセクションに応じて複数回呼び出されます。

最近、jmeter を使用してアプリケーションのストレス テストを行っていました - 連続ループ (サーバー アプリ) で 150 スレッドを実行したところ、クラッシュしました (SIGSEGV)。GDBを介して実行すると、 とマークされた行が表示され//CRASHES HEREました。その後、GDBで数回実行しましたが、常に同じ時点でクラッシュします。

ただし、テーブル内の値で常にクラッシュするとは限りません。たとえば、最初にクラッシュしたとき:

counter = 2
subsecnum = 21

2回目はクラッシュしました:

counter = 19
subsecnum = 10

等々...

範囲外エラーの値を確認して再確認しましたが、そうではありません。値はすべて有効です。

some_global_table[counter].section:ポインターを使用するだけでなく、実際に全体をバッファーにコピーすると、クラッシュしないことがわかりました。ただし、読み取りセクションの周りでミューテックスを使用しても機能しませんでした...

詳細が必要な場合は、お知らせください。

EDIT : グローバル テーブルは最初にロードされ、その後は変更されないためsection->entries、データがロードされると、特定のセクションの値は常に同じになります。

EDIT2 : section_t の構造

 typedef struct
 {
     int entries;
     subsection_t * subsections;
 } section_t;

 typedef struct
 {
     int value;
     char title[MAX_LEN_TITLE];
 } subsection_t;

 typedef struct
 {
     char bookname[MAX_LEN_BOOK_TITLE];
     FILE * bookfile;
     section_t section;
 } global_table_t;

 global_table_t some_global_table[MAX_TABLES];

EDIT3

 Dump of assembler code from 0x4132a1 to 0x413321:
    0x00000000004132a1 <myfunc+389>:    roll   0x0(%rcx)
    0x00000000004132a4 <myfunc+392>:    mov    $0x0,%eax
    0x00000000004132a9 <myfunc+397>:    callq  0x408382 <log>
    0x00000000004132ae <myfunc+402>:    jmpq   0x413517 <myfunc+1019>
    0x00000000004132b3 <myfunc+407>:    mov    -0x68(%rbp),%rax
    0x00000000004132b7 <myfunc+411>:    mov    (%rax),%rax
    0x00000000004132ba <myfunc+414>:    sub    $0x1,%eax
    0x00000000004132bd <myfunc+417>:    mov    %eax,-0xc(%rbp)
    0x00000000004132c0 <myfunc+420>:    movl   $0x0,-0x5c(%rbp)
    0x00000000004132c7 <myfunc+427>:    jmpq   0x413505 <myfunc+1001>
    0x00000000004132cc <myfunc+432>:    mov    -0x68(%rbp),%rax
    0x00000000004132d0 <myfunc+436>:    mov    0x10(%rax),%rdx
    0x00000000004132d4 <myfunc+440>:    mov    -0x5c(%rbp),%eax
    0x00000000004132d7 <myfunc+443>:    cltq   
    0x00000000004132d9 <myfunc+445>:    shl    $0x4,%rax
    0x00000000004132dd <myfunc+449>:    lea    (%rdx,%rax,1),%rax
 => 0x00000000004132e1 <myfunc+453>:    mov    0x8(%rax),%eax
    0x00000000004132e4 <myfunc+456>:    mov    %eax,-0x8(%rbp)
    0x00000000004132e7 <myfunc+459>:    mov    -0x68(%rbp),%rax
    0x00000000004132eb <myfunc+463>:    mov    0x10(%rax),%rax
    0x00000000004132ef <myfunc+467>:    lea    0x10(%rax),%rdx
    0x00000000004132f3 <myfunc+471>:    mov    -0x5c(%rbp),%eax
    0x00000000004132f6 <myfunc+474>:    cltq   
    0x00000000004132f8 <myfunc+476>:    shl    $0x4,%rax
    0x00000000004132fc <myfunc+480>:    lea    (%rdx,%rax,1),%rax
    0x0000000000413300 <myfunc+484>:    mov    0x8(%rax),%eax
    0x0000000000413303 <myfunc+487>:    mov    %eax,-0x4(%rbp)
    0x0000000000413306 <myfunc+490>:    cvtsi2sdl -0x8(%rbp),%xmm0
    0x000000000041330b <myfunc+495>:    movsd  %xmm0,-0x50(%rbp)
    0x0000000000413310 <myfunc+500>:    cvtsi2sdl -0x4(%rbp),%xmm0
    0x0000000000413315 <myfunc+505>:    movsd  %xmm0,-0x40(%rbp)
    0x000000000041331a <myfunc+510>:    mov    -0x68(%rbp),%rax
    0x000000000041331e <myfunc+514>:    mov    0x10(%rax),%rdx

    rax            0xa80    2688
    rbx            0x7fffc03f9710   140736418780944
    rcx            0x4066c00000000000   4640607572284407808
    rdx            0x0  0
    rsi            0xfffff00000000  4503595332403200
    rdi            0x7fffc039e8f0   140736418408688
    rbp            0x7fffc039e9f0   0x7fffc039e9f0
    rsp            0x7fffc039e950   0x7fffc039e950
    r8             0x13 19
    r9             0x1  1
    r10            0x9  9
    r11            0x7fffc039e848   140736418408520
    r12            0x7fffedd86d60   140737183772000
    r13            0x7fffc03f99d0   140736418781648
    r14            0x4  4
    r15            0x7  7
    rip            0x4132e1 0x4132e1 <myfunc+453>
    eflags         0x10202  [ IF RF ]
    cs             0x33 51
    ss             0x2b 43
    ds             0x0  0
    es             0x0  0
    fs             0x0  0
    gs             0x0  0
4

4 に答える 4

0

完全なコンテキストがなければ、それを言うのは難しい. 私がお勧めすることの 1 つは、サーバー プログラムをValgrindで実行して、実際にメモリ オーバーランが発生しているかどうかを確認することです。配列アクセスを行っているため、何か問題があると思われます。コメンテーターが指摘したように、キャスティングに問題があるとは思えません。

于 2013-05-01T19:46:41.107 に答える