質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Q&A

解決済

1回答

448閲覧

linux ptraceとシグナル

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

0グッド

0クリップ

投稿2018/09/09 07:33

ptraceはデバッガの中核であるシステムコールですが、デバッガとデバッギの間でどのようにシグナルが処理されるかよくわかりません。

linux manページによると

トレースの実行中、子プロセスはシグナルが配送されるたびに、 たとえそのシグナルが 無視すべきものであっても停止する (SIGKILL は例外で、通常どおりの効果をもたらす)。 親プロセスには次の wait(2) で通知され、停止している間に子プロセスを調べたり修 正したりすることができる。 そして親プロセスは子プロセスの実行を再開させるが、配送 された シグナルを無視することもできる (あるいは代わりに別のシグナルを 配送するこ ともできる) 。

ということになっています。

これは例えば、デバッギの実行がint3命令に到達しカーネルからSIGTRAPシグナルを受け取ったときには
デバッギは単に停止し、デバッガがwaitシステムコールを使ってデバッギの状態変化を受け取るということだと思います。以前にあるプログラムをデバッグしたときのことなのですが、デバッギがSIGTRAPに対して登録したシグナルハンドラが呼び出されませんでした。「デバッギは停止する」という表現が曖昧でよくわからないのですが、この際デバッギに配送されたシグナルはどう処理されるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

int3はハードウエアの話で、OS, アプリに関係無く発生します。
一方、SIGTRAP等の割り込みは、Unix系のOSの話で、8086では無いマシンであっても発生します。
int3 が起こったときに、ハードウエアは現在の処理内容をスタックして、特定のアドレスから処理を続けます。それはデバッガかもしれないし、もっと違うものかもしれません。ハードウエアに処理が登録されていなければ、暴走します。元の「現在の処理内容」に戻ることもできるし、戻らないこともできます。例えば、電源切ってしまうとか。

SIGTRAPは、int3とは限らず0による除算、キーボード入力、HDDなどの外部機器が原因になって発生することもあります。signal イベントが発生したときには、OSに登録された処理が実行されます。デバッガを使ってデバッグしているのであれば、デバッガが登録した関数などの処理が行われます。

デバッグ対象のアプリ、DUTが自発的にSIGxxxするとは限らず、debug目的であれば、デバッガが何かSIGxxxを行う要因を作ります。例えば、マシンコードレベルの一連の命令コードの中に"CD"という命令を既存の命令ストリームに上書きして埋め込みます。CDの命令に達したときに、ハードは、ハードの割り込み処理を行い、それはOSの割り込みハンドラになっていて、そのOS割り込みハンドラは、実行中のプロセスのシグナルハンドラを呼び出します。今の場合、debuggerの割り込みハンドラ。

気に入ったか、解決したら評価してね。

投稿2018/09/14 23:40

gm300

総合スコア580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問