2

ARM ハードウェア ターゲット用のソースから特別にビルドされた linaro ツールチェーンを使用して ARM ターゲット用にビルドされた C++ コードがあります (softfp、mtune=cortex-a9 などを使用)。時々、コードが以下のトレースでクラッシュします。実行中のプロセスに gdb をアタッチしました libstdc++.so.6 からの新しいオペレーターが呼び出された後、いくつかの呼び出しがクラッシュするようです。

現時点では例外処理コードがないため、 new が失敗して例外をスローした場合、次のようなメッセージで中断/終了したと推測されます。

Program received signal SIGABRT, Aborted.

しかし、代わりに SIGSEGV でクラッシュします。

どうしてこんなことに?何がうまくいかないのですか?

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x45c6b460 (LWP 1182)]
0x402fad12 in malloc_consolidate () from /lib/libc.so.6
#0  0x402fad12 in malloc_consolidate () from /lib/libc.so.6
#1  0x402fc498 in _int_malloc () from /lib/libc.so.6
#2  0x402fe414 in malloc () from /lib/libc.so.6
#3  0x401f54d6 in operator new(unsigned int) () from /lib/libstdc++.so.6
#4  0x400f30d4 in MyMsg::operator=(MyPkt*) () from /usr/lib/libmy-ARMV7AL.so
#5  0x400f322c in MyMsg::reply() () from /usr/lib/libmy-ARMV7AL.so
#6  0x0005a6a0 in MyManager::SendMessage (this=0x7188c8)
    at MyManager.cpp:12973
#7  0x0004389c in My::Response (this=0x7188c8)
    MyManager.cpp:5972
4

2 に答える 2

1

十分なメモリが残っていない場合、 new は例外をスローします。しかし、ログ内に例外はありません。なのでメモリは十分あると思います。より可能性の高い答えは、何らかの形でメモリを破損したということです。valgrind でメモリアクセスを確認する必要があります

さらに気になるのは、 = 演算子のプロトタイプです。 MyMsg::operator=(MyPkt*). オブジェクトの const 参照ではなくポインターを使用するのはなぜですか? または少なくともconst MyPkt const *

于 2013-10-16T09:51:59.300 に答える
1

ヒープが破損している可能性があります (malloc がプロセスを終了する理由を説明しています)。

通常のツールを使用して、未定義の動作 (不正なメモリ アクセスなど) を検出します。

例外処理が失敗した場合 (クロスコンパイルなどの ABI ストレッサーが存在する場合はそれほど珍しいことではありません)、次nothrowのバージョンを使用できoperator newます。

X* x = new (nothrow) X;

assert(x); // or otherwise handle with care
于 2013-10-16T09:44:35.670 に答える