2

割り当てられたので、シグナル、setjmp、および longjmp の C 関数を使用して、ユーザー レベルのスレッド ライブラリをシミュレートします。基本的に、プログラムには「スレッド」ごとのメモリ割り当てが含まれ、ロング ジャンプとシグナルを使用して非直接コード フローとプリエンプションをシミュレートします。

valgrind ツールを実行すると、次の形式のメッセージが表示されます: """

Invalid write of size 8
==19100== at 0x560020F: __sigsetjmp (setjmp.S:36)
==19100== by 0x403EC3: switchThreads(bool, bool, bool) (uthreads.cpp:673)
==19100== by 0x403DE6: signalHandler(int) (uthreads.cpp:652)
==19100== by 0x56004EF: ??? (in /lib/x86_64-linux-gnu/libc-2.13.so)
==19100== by 0x404D93: t1() (tal3.cpp:23)
==19100== Address 0x5959c90 is 48 bytes inside a block of size 4,312 alloc'd

==19100== at 0x4C2851B: operator new(unsigned long, std::nothrow_t const&) (vg_replace_malloc.c:316)

==19100== by 0x402E67: uthread_spawn(void (*)()) (uthreads.cpp:358)
==19100== by 0x404DD6: main (a3.cpp:41)

"""

このツールのいくつかのフォーラムとドキュメントを読みましたが、私の理解では、valgrind ではロング ジャンプと「setjmp」(シグナル処理ジャンプに限り) がサポートされていないようで、メモリの問題と思われるものを引き起こします -しかし、明確な答えは思いつきませんでした。

助けていただければ幸いです。ありがとう。

4

1 に答える 1

5

valgrind ではロング ジャンプと「setjmp」(シグナル処理ジャンプに限る) はサポートされていないようです。

より正確には、{sig,}longjmp による「カスタム」スタック スイッチングは、Valgrind では直接サポートされていません。

特別な Valgrind アノテーションを付けて、実行中のスタック切り替えについて Valgrind に通知できますが、これはおそらく簡単な作業ではありません。このドキュメント、およびVALGRIND_STACK_REGISTERVALGRIND_STACK_DEREGISTERおよびVALGRIND_STACK_CHANGEクライアントの要求を特に参照してください。

于 2013-04-15T15:01:52.560 に答える