編集 2: 私はまだここで立ち往生していますが、問題はこの質問とは関係のない自動ベクトル化書き換えシステムにある可能性が最も高いです。以下のコメントに記載されているvalgrindのSIGILL出力で、この質問を再度更新しています
==10478== Process terminating with default action of signal 4 (SIGILL)
==10478== Illegal opcode at address 0x423F4C ==10478== at 0x423F4C: sp_private_9_compute (smmintrin.h:209)
==10478== by 0x4247F4: sp_private_9__timeCompute
SSE コードのデバッグ時に valgrind によって SIGILL が発生したかどうかを確認する最初のことは、VALGRIND が最新であることです。私の場合、SSE4 組み込みサポートにバグがある V3.6 を使用していました。_mm_mullo_epi32 命令を理解していないため、SIGILL が発生しました。V3.9 に更新した後、valgrind は SSE プログラムの実際の問題をより適切に特定できるようになりました。
関連するデバッグのヒントが見つかったら、この質問を再度更新します。
編集 1: 誰かが、デバッグ トレースでの非順次動作の観察が正確であることを確認できることを願っています。
まず第一に、これは C のデバッグに関する非常に具体的な質問です。ご一読いただき、フィードバックをお寄せいただければ幸いです。
背景: 私はコード生成システムを使用していますが、最近、glibc から「二重解放または破損」が発生し続けています。そこで、自動生成されたコードをデバッグ情報を追加して再コンパイルし、gdbで実行しました。そして、私は今脳死しているか、シーケンシャルコード実行で非シーケンシャルな動作を実際に観察しました。
コード:
LINE:6851 if(self->_garbage != 0) {
LINE:6852 sp_env_list_free_children(self->_garbage);
LINE:6853 sp_env_list___del__(self->_garbage);
LINE:6854 sp_env_free(self->_garbage, sizeof(sp_env_list_t));
LINE:6855 }//End of if
LINE:6856 }//End of an outer if structure
LINE:6857 }//End of the function call containing the if structure
free と del funcs については、デバッグ トレースの後で説明します。
トレースのデバッグ
6851 if (((self->_garbage != 0))) {
(gdb) step
6852 sp_env_list_free_children(self->_garbage);
(gdb) print self->_garbage
$1 = (sp_env_list_t *) 0x649080
(gdb) step
6853 sp_env_list___del__(self->_garbage);
(gdb) print self->_garbage
$2 = (sp_env_list_t *) 0x649080
(gdb) step
6854 sp_env_free(self->_garbage, sizeof(sp_env_list_t ));
(gdb) print self->_garbage
$3 = (sp_env_list_t *) 0x649080
(gdb) step
6857 }
(gdb) print self->_garbage
$4 = (sp_env_list_t *) 0x649080
(gdb) step
sp_private_11___del__ (self=<value optimized out>) at sp_moddft_int32.c:6854
6854 sp_env_free(self->_garbage, sizeof(sp_env_list_t ));
(gdb) print self->_garbage
Cannot access memory at address 0x18
(gdb) step
Single stepping until exit from function sp_env_free,
which has no line number information.
*__GI___libc_free (mem=0x649080) at malloc.c:3692
3692 malloc.c: No such file or directory.
in malloc.c
デバッグ トレースでわかるように、6854 行目から 6857 行目まで到達し、再び 6854 行目に戻ってきます。self->_garbage は完全に解放されているため、ここで「二重解放または破損」が発生するはずです。ただし、関数全体はシーケンシャルであり、ループはありません。なぜ跳ね返ったのか理解できません。
質問を完全にするために、if 構造の 3 つの関数は次のとおりです。
- sp_env_list_free_children() は、e = self->_garbage->head から e = self->_garbage->tail までのすべての e->_data を解放します。
- sp_env_list_ del () は、self->_garbage->head から self->_garbage->tail へのポインターを削除します。
- sp_env_free() は、self->_garbage ポインターを解放します
明確でない場合は、追加情報を提供できます。誰かが、非連続的な動作に関する私の観察が正確であることを少なくとも確認できることを願っています。本当にありがとう!