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