更新
OPで言及されているdebug.cの行を見つけました。このコードの上の2行から、次のことがわかります。
redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");
同じコードが_redisPanic
にあります 同様に、SIGSEGV
を強制する方法のように見えます アサーションが失敗したとき、またはパニックが発生したとき。
オリジナル
これはデバッグツールのように見えます。このドキュメントから、Redisデバッグガイドと関連セクションに次のように記載されています。
Redisには、DEBUG SEGFAULTコマンドを使用してセグメンテーション違反(つまり、悪いクラッシュ)をシミュレートするコマンドがあります(もちろん、実際の本番インスタンスに対しては使用しないでください;)。したがって、このコマンドを使用してインスタンスをクラッシュさせ、GDB側で何が発生するかを示します。
このgdb出力を表示します:
(gdb) continue
Continuing.
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffffffffff
debugCommand (c=0x7ffc32005000) at debug.c:220
220 *((char*)-1) = 'x';
^^^^^^^^^^^^^^^^^^^
-1
をキャストしています * char **に変換し、間接参照を実行して'x'
を割り当てます そのメモリ位置に。リンクされたスレッドとして((void *)-1)は有効なアドレスですか?ほとんどのシステムでは、に値を割り当てることは言うまでもなく、アクセスすることは有効ではないと言います。これにより、最新のオペレーティングシステムのほとんどでセグメンテーション違反が発生します。
これは未定義の動作であり、スレッドで説明したように、CでSegfaultを生成するための最も簡単な標準準拠の方法は何ですか?信頼することはできません。コンパイラーはよりスマートになり、コンパイラーが予期しない悪い方法で未定義の動作を悪用することについて賢い例がいくつかあります。