2017-08-17 15 views
0

Veracryptを使ってボリュームをマウントしたときに呼び出される関数の順序を知りたいので、gdbで "Veracrypt"をデバッグしています。 Veracryptはマルチスレッドを使用しているので、gdbオプション "-g"を書いてMakeFileを変更し、thread apply all bt fullset follow-fork-mode childなどのコマンドを使用しました。また、私はsudo gdb -p [process ID]のようなスレッドIDを使ってスレッドをアタッチしようとしました。GDBを使ってマルチスレッドをデバッグする方法は?

私はVeracryptのコードをデバッグできますが、コードをデバッグすることはできません。

Veracryptの実行時(ボリュームマウントとマウント解除プロセス)に使用するマルチスレッドのスレッドIDを確認し、gdbが作成したスレッドのスレッドIDを以下のように表示しました。

[New Thread 0x7fffedf3e700 (LWP 5071)] 
[New Thread 0x7fffed73d700 (LWP 5072)] 
[New Thread 0x7fffecf3c700 (LWP 5073)] 
[New Thread 0x7fffe7fff700 (LWP 5074)] 
[New Thread 0x7fffe522f700 (LWP 5075)] 
[New Thread 0x7fffe4a2e700 (LWP 5076)] 
[New Thread 0x7fffdf568700 (LWP 5077)] 
[New Thread 0x7fffded67700 (LWP 5078)] 
[New Thread 0x7fffde566700 (LWP 5079)] 
[Thread 0x7fffded67700 (LWP 5078) exited] 
[New Thread 0x7fffded67700 (LWP 5081)] 
[New Thread 0x7fffc9798700 (LWP 5082)] 
[New Thread 0x7fffc8f97700 (LWP 5083)] 
[New Thread 0x7fffc3fff700 (LWP 5084)] 
[New Thread 0x7fffc37fe700 (LWP 5085)] 
[New Thread 0x7fffc2ffd700 (LWP 5086)] 
[Thread 0x7fffc3fff700 (LWP 5084) exited] 
[Thread 0x7fffc2ffd700 (LWP 5086) exited] 
[Thread 0x7fffc37fe700 (LWP 5085) exited] 
[Thread 0x7fffded67700 (LWP 5081) exited] 
[Thread 0x7fffc8f97700 (LWP 5083) exited] 
[Thread 0x7fffc9798700 (LWP 5082) exited] 
[New Thread 0x7fffc9798700 (LWP 5087)] 
[New Thread 0x7fffc8f97700 (LWP 5088)] 
[New Thread 0x7fffded67700 (LWP 5089)] 
[New Thread 0x7fffc37fe700 (LWP 5090)] 
[New Thread 0x7fffc3fff700 (LWP 5091)] 
[Thread 0x7fffc9798700 (LWP 5087) exited] 
[Thread 0x7fffc8f97700 (LWP 5088) exited] 
[Thread 0x7fffc37fe700 (LWP 5090) exited] 
[Thread 0x7fffc3fff700 (LWP 5091) exited] 
[Thread 0x7fffde566700 (LWP 5079) exited] 
[New Thread 0x7fffde566700 (LWP 5092)] 
[New Thread 0x7fffc3fff700 (LWP 5093)] 
[Thread 0x7fffc3fff700 (LWP 5093) exited] 
[Thread 0x7fffded67700 (LWP 5089) exited] 
[New Thread 0x7fffded67700 (LWP 5094)] 
[Thread 0x7fffded67700 (LWP 5094) exited] 
[New Thread 0x7fffded67700 (LWP 5095)] 
[Thread 0x7fffded67700 (LWP 5095) exited] 
[Thread 0x7fffedf3e700 (LWP 5071) exited] 
[Thread 0x7fffed73d700 (LWP 5072) exited] 
[Thread 0x7fffe7fff700 (LWP 5074) exited] 
[Thread 0x7fffecf3c700 (LWP 5073) exited] 
[Thread 0x7fffe522f700 (LWP 5075) exited] 
[Thread 0x7ffff7fc4a40 (LWP 5066) exited] 
[Thread 0x7fffdf568700 (LWP 5077) exited] 
[Thread 0x7fffe4a2e700 (LWP 5076) exited] 
[Inferior 1 (process 5066) exited normally] 

そして、私はVeracryptをファイルに(ボリュームマウントおよびマウント解除のプロセス)を実行している場合に、各機能を実行するスレッドのIDを書き込むために「のfprintf(..)」と「GETPID()」を使用。 (gdbでデバッグすることができない関数コードでは、 "printf(...)"関数は値を端末に出力するのではなく、関数コードで出力することができるのでデバッグすると、端末に値が出力されます)

"fprintf"関数を使って生成したファイルでデバッグしたい機能を実行したスレッドIDを確認すると、スレッドIDのリストにはありませんgdb(上のコード)によって生成され、リスト内のスレッドIDより大きい値を持っています。 (このコード(上記のコード)では、デバッグする関数を実行するスレッドIDは5098です)。

CoreUnix.cpp::MountVolumeCoreLinux::MountVolumeNativeなどの一部の機能をデバッグしたいとします。これらの関数をgdbでどのようにデバッグできますか?

答えて

0

私はGLIBCの非古代のバージョン(のためにあなたがいるように見えること

注各機能を実行するスレッドのIDを書き込むために「)(GETPID」「のfprintf(..)」を使用し、 )、getpidはスレッドIDではなくプロセスIDを返します。代わりにgettidを使用します。

gdbでデバッグできない関数コードでは、 "printf(...)"関数は値を端末に出力しないため、デバッグ可能な関数コードでは値端末に印刷されています。)

は、あなたが「デバッグすることができない機能」によって何正確を意味していますか?

私はあなたがそのコードにブレークポイントを設定できると思うが、ブレークポイントは決してヒットしない。その場合、間違ったプロセスをデバッグしているように思えます。一般に、set follow-fork-mode childはめったに望んでいません。子プロセスを作成するプロセスは、複数の子プロセスを作成することがよくあります。最初の子プロセスを常にforkにデバッグすることは非常にまれです。

+0

「gettid()」も使用しましたが、値はgetpid()の値と同じでした。 「デバッグできない機能」という意味は、マルチスレッドのデバッグに使用されるオプションを使用してブレークポイントで停止するのではなく、Veracryptのマウント処理中に実行する機能コードであるということです。 –

関連する問題