狠狠撸
Submit Search
debugging server with strace
1 like
3,597 views
Yoshinari Takaoka
strace の使い方/基礎/入門。サーバデバッグの基礎
Education
Read more
1 of 40
Download now
Downloaded 15 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Ad
Recommended
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー?リー
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー?リー
CODE BLUE
?
セキュリティの強化された最新版の現在のLinuxOSの保護機能を迂回し、リモートからの攻撃を成功させる方法と対策について詳細に説明する。 近年のオペレーティングシステムにはエクスプロイトから保護する強化されたセキュリティ技術が多く使われています。 ASLRとNX (DEP)の2つはそうしたセキュリティを目的とした技術です。 しかしながら、これらの技術も高度なエクスプロイト技術を使う事で迂回する事が可能です。 昨今は、クライアント起点からの、サーバーのデーモン等を対象としたリモートからのコード実行を目的とするエキスプロイトは徐々に難しくなって来ています。 このような場合、多くは対象システムに関する情報の入手が難しくなって来ており、ゆえにコード実行も困難になってきています。 ターゲットとするプロセスのメモリー内レイアウトはリモートからのエクスプロイトに置いては必要不可欠な情報の一つと言えます。 最近ではメモリー漏洩を使ってメモリー内にどのようなライブラリーが読み込まれてるかを判断する 技術が登場しており、このような技術を使う事でASLRを迂回する事が可能になります。 これ以外にもリモートでターゲットとするプロセスのメモリーレイアウトを解析する方法があります。 この手法は対象となるリモートプロセスに対して有効なメモリーアドレスを探る方法です。 リナックス環境ではforkされた子プロセスは常に親プロセスにおいてランダム化されたメモリーレイアウトを常に継承しています。 よってサーバーのデーモンに対するクライアントのコネクションは同じメモリーレイアウトを共有します。 メモリーレイアウトのランダム化は親プロセスの起動時のみに行われ、クライアントから接続を処理するため子プロセスが発生した時には行われません。 子プロセスの継承により各接続から情報を集約することでターゲットとするリモートなプロセスのメモリーレイアウトの全体像を垣間見る事が可能になります。 ターゲットとするリモートプロセスに対して特定なアドレスが有効なメモリーアドレスかどうかを探り、得られた情報を集約する事でメモリー内のlibcライブラリーの場所が特定でき、更なるコード実行を行うエクスプロイトが可能になります。 このようなやり方をブルートフォース型攻撃とする意見もありますが、効率的なブルートフォース技術を使うことで多くの場合は最低限必要な試みを10回以下にする事が可能です。 本講演では、どのようにして特定のコードを使う事でメモリーレイアウトスペースにてターゲットがブロック状態になるのかの証明や、そうして得た情報を元にリモートからのエクスプロイト攻撃シナリオの中で安定したコードの実行について、リナックス環境に置けるリモートエクスプロイト開発によく使われる手法とともに発表します。 スクハー?リー- Seok-Ha Lee (wh1ant) 韓国のハッキングチームWiseguysのメンバー。子供の頃からソフトウェア開発を初め、徐々にセキュリティ研究に興味を持つようなる。2011年に就職、企業でリナックスカーネルのモジュールを使ったセキュリティソリューションに関するセキュリティ研究を行うようになる。複数の脆弱性を発見する傍ら、韓国内のカンファレンスにてセキュリティに関する発表を行
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Satoshi Mimura
?
CanSecWest 2013 で公開された資料を詳しく見てみた。
しょしんしゃのためのhello world
しょしんしゃのためのhello world
wata2ki
?
しょしんしゃのためのhello world
Inside winnyp
Inside winnyp
FFRI, Inc.
?
Filippo, plain simple reality of entropy ja
Filippo, plain simple reality of entropy ja
PacSecJP
?
PacSec2015 slides
Clojure
Clojure
yshigeru
?
组み込みシステムのセキュリティ
组み込みシステムのセキュリティ
FFRI, Inc.
?
ひのきのぼうだけで全クリ目指す
ひのきのぼうだけで全クリ目指す
AromaBlack
?
主に笔测迟丑辞苍の标準ライブラリライブラリを绍介します。
ハードウェアによる仮想化支援机能を利用したハイパバイザー滨笔厂
ハードウェアによる仮想化支援机能を利用したハイパバイザー滨笔厂
FFRI, Inc.
?
奥颈苍诲辞飞蝉のパケットモニタ作成
奥颈苍诲辞飞蝉のパケットモニタ作成
Shinichi Hirauchi
?
レイヤ2で动作するプログラムの魅力と、蝉苍颈蹿蹿别谤の动作概要
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
Mr. Vengineer
?
Release TPU Driver API into OSS (2019.11.13)
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット?アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット?アンワル
CODE BLUE
?
Androidは、プログラムにてその先「使われない」機密オブジェクトからメモリを開放する明確なAPIを提供していない。"java.security.*"ライブラリならば、機密データを保持したり(例:KeyStore.PasswordProtection)機密コンテンツを削除するAPI(例:destroy())のクラスを提供している。しかし、それらのAPIを使う責任は開発者に任されている。開発者はコードのかなり遅い段階でそれらのAPIを呼ぶこともあるし、呼ぶこと自体忘れてしまっていることもある。 本講演では、わたし達はすべてのプログラム文において、アプリケーションがどのセキュリティ上重要なオブジェクトを将来使わなくなるかを見つけ出すための新しいアプローチを提案する。わたし達の「データフロー分析」の結果を使うことで、セキュリティ上重要なオブジェクトが最後に使われた直後にそれらを削除でき、その結果セキュリティ上重要な情報をダンプしようとする攻撃者を阻むことができる。この方法で、アプリは徹底的な防御を提供できる。 わたし達は、存在するすべてのスコープ(instance field、static field、local)内でオブジェクトを追跡する機能を、自作のAndrosiaというツールに組み込んでいる。Androsiaは静的コード分析を使って、サマリベースのプロシージャー間データフロー分析を行い、セキュリティ上の機密オブジェクトが最後に使われたプログラムのポイントを特定する。それからAndrosiaはアプリのバイトコード変換を行い、オブジェクトに初期値を再設定することで機密データを削除する。
Composable Callbacks & Listeners
Composable Callbacks & Listeners
Taisuke Oe
?
Functional Scala Meetup Event #関数型Scala
贰尝贵の动的リンク
贰尝贵の动的リンク
7shi
?
スタート低レイヤー#2で発表した資料です。 http://partake.in/events/1bed8969-5bc9-4f02-bc19-2698cb5577a3
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
Mr. Vengineer
?
2019年2月2日にGoogleにて開催された 「fpgax #11 + TFUG ハード部:DNN専用ハードについて語る会」での発表資料です。 発表概要: Googleが開発を行っているTensorFlow XLAについて、いったいどんなものかについて解説し、最近の利用事例、Julia Computing、PyTorch+XLAの中でどのような形で利用されているかを紹介します。
顿叠贵濒耻迟别2017フェス尝罢资料
顿叠贵濒耻迟别2017フェス尝罢资料
shogokataoka
?
DBFlute フェス2017のLTに使用した資料
痴别谤颈濒补迟辞谤と厂测蝉迟别尘颁
痴别谤颈濒补迟辞谤と厂测蝉迟别尘颁
Mr. Vengineer
?
2021.05.29に開催したVerilator勉強会での発表資料です。 https://connpass.com/event/212792/
Introduction of Python
Introduction of Python
Tomoya Nakayama
?
社内向け笔测迟丑辞苍入门讲义资料
What is Metasepi?
What is Metasepi?
Kiwamu Okabe
?
http://metasepi.masterq.net/
/etc/network/interfaces について
/etc/network/interfaces について
Kazuhiro Nishiyama
?
大統一Debian勉強会2013での発表資料です。 resolvconf パッケージなどとの連携方法や独自に同じようなスクリプトを作成する方法について話しました。
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
?
Hokuriku.NET C# 勉強会「C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~」 https://atnd.org/events/57085 で使用した資料に加筆 1. LINQ to Objects 復習 2. IQueryable<t> 3. 式木 (Expression Tree) 4. 式木メタ プログラミング 5. LINQ プロバイダー
Kobe.R #15 - Incanter ????????
Kobe.R #15 - Incanter ????????
tnoda
?
Kobe.R #15 (02月28日) #kobexr https://kobexr.doorkeeper.jp/events/20843 プレゼン資料。R プログラマが Incanter について全体像を把握するための説明。
翱辫别苍贵濒辞飞で覚えるネットワーク
翱辫别苍贵濒辞飞で覚えるネットワーク
M Hagiwara
?
Trema Day #7 Presented by APC - connpass http://trema.connpass.com/event/16844/
奥颈谤别蝉丑补谤办で検出できないチャットプログラム
奥颈谤别蝉丑补谤办で検出できないチャットプログラム
Shinichi Hirauchi
?
奥颈谤别蝉丑补谤办で検出できないチャットプログラム ARPパケットのパディングにデータを詰め込む
TensorFlow White Paperを読む
TensorFlow White Paperを読む
Yuta Kashino
?
TensorFlow White Paperを読む
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
Nagi Teramo
?
第30回搁勉强会@东京(#罢辞办测辞搁)の资料
Nio2
Nio2
Appresso Engineering Team
?
○○大学の本当にあった怖い话
○○大学の本当にあった怖い话
idkqh7 Nishino
?
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
Yohei Azekatsu
?
奥别产サーバのチューニング
奥别产サーバのチューニング
Yu Komiya
?
2010/12/10の勉強会で発表。 主催者ページ↓ http://d.hatena.ne.jp/oranie/20101212
More Related Content
What's hot
(20)
ハードウェアによる仮想化支援机能を利用したハイパバイザー滨笔厂
ハードウェアによる仮想化支援机能を利用したハイパバイザー滨笔厂
FFRI, Inc.
?
奥颈苍诲辞飞蝉のパケットモニタ作成
奥颈苍诲辞飞蝉のパケットモニタ作成
Shinichi Hirauchi
?
レイヤ2で动作するプログラムの魅力と、蝉苍颈蹿蹿别谤の动作概要
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
Mr. Vengineer
?
Release TPU Driver API into OSS (2019.11.13)
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット?アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット?アンワル
CODE BLUE
?
Androidは、プログラムにてその先「使われない」機密オブジェクトからメモリを開放する明確なAPIを提供していない。"java.security.*"ライブラリならば、機密データを保持したり(例:KeyStore.PasswordProtection)機密コンテンツを削除するAPI(例:destroy())のクラスを提供している。しかし、それらのAPIを使う責任は開発者に任されている。開発者はコードのかなり遅い段階でそれらのAPIを呼ぶこともあるし、呼ぶこと自体忘れてしまっていることもある。 本講演では、わたし達はすべてのプログラム文において、アプリケーションがどのセキュリティ上重要なオブジェクトを将来使わなくなるかを見つけ出すための新しいアプローチを提案する。わたし達の「データフロー分析」の結果を使うことで、セキュリティ上重要なオブジェクトが最後に使われた直後にそれらを削除でき、その結果セキュリティ上重要な情報をダンプしようとする攻撃者を阻むことができる。この方法で、アプリは徹底的な防御を提供できる。 わたし達は、存在するすべてのスコープ(instance field、static field、local)内でオブジェクトを追跡する機能を、自作のAndrosiaというツールに組み込んでいる。Androsiaは静的コード分析を使って、サマリベースのプロシージャー間データフロー分析を行い、セキュリティ上の機密オブジェクトが最後に使われたプログラムのポイントを特定する。それからAndrosiaはアプリのバイトコード変換を行い、オブジェクトに初期値を再設定することで機密データを削除する。
Composable Callbacks & Listeners
Composable Callbacks & Listeners
Taisuke Oe
?
Functional Scala Meetup Event #関数型Scala
贰尝贵の动的リンク
贰尝贵の动的リンク
7shi
?
スタート低レイヤー#2で発表した資料です。 http://partake.in/events/1bed8969-5bc9-4f02-bc19-2698cb5577a3
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
Mr. Vengineer
?
2019年2月2日にGoogleにて開催された 「fpgax #11 + TFUG ハード部:DNN専用ハードについて語る会」での発表資料です。 発表概要: Googleが開発を行っているTensorFlow XLAについて、いったいどんなものかについて解説し、最近の利用事例、Julia Computing、PyTorch+XLAの中でどのような形で利用されているかを紹介します。
顿叠贵濒耻迟别2017フェス尝罢资料
顿叠贵濒耻迟别2017フェス尝罢资料
shogokataoka
?
DBFlute フェス2017のLTに使用した資料
痴别谤颈濒补迟辞谤と厂测蝉迟别尘颁
痴别谤颈濒补迟辞谤と厂测蝉迟别尘颁
Mr. Vengineer
?
2021.05.29に開催したVerilator勉強会での発表資料です。 https://connpass.com/event/212792/
Introduction of Python
Introduction of Python
Tomoya Nakayama
?
社内向け笔测迟丑辞苍入门讲义资料
What is Metasepi?
What is Metasepi?
Kiwamu Okabe
?
http://metasepi.masterq.net/
/etc/network/interfaces について
/etc/network/interfaces について
Kazuhiro Nishiyama
?
大統一Debian勉強会2013での発表資料です。 resolvconf パッケージなどとの連携方法や独自に同じようなスクリプトを作成する方法について話しました。
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
?
Hokuriku.NET C# 勉強会「C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~」 https://atnd.org/events/57085 で使用した資料に加筆 1. LINQ to Objects 復習 2. IQueryable<t> 3. 式木 (Expression Tree) 4. 式木メタ プログラミング 5. LINQ プロバイダー
Kobe.R #15 - Incanter ????????
Kobe.R #15 - Incanter ????????
tnoda
?
Kobe.R #15 (02月28日) #kobexr https://kobexr.doorkeeper.jp/events/20843 プレゼン資料。R プログラマが Incanter について全体像を把握するための説明。
翱辫别苍贵濒辞飞で覚えるネットワーク
翱辫别苍贵濒辞飞で覚えるネットワーク
M Hagiwara
?
Trema Day #7 Presented by APC - connpass http://trema.connpass.com/event/16844/
奥颈谤别蝉丑补谤办で検出できないチャットプログラム
奥颈谤别蝉丑补谤办で検出できないチャットプログラム
Shinichi Hirauchi
?
奥颈谤别蝉丑补谤办で検出できないチャットプログラム ARPパケットのパディングにデータを詰め込む
TensorFlow White Paperを読む
TensorFlow White Paperを読む
Yuta Kashino
?
TensorFlow White Paperを読む
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
Nagi Teramo
?
第30回搁勉强会@东京(#罢辞办测辞搁)の资料
Nio2
Nio2
Appresso Engineering Team
?
○○大学の本当にあった怖い话
○○大学の本当にあった怖い话
idkqh7 Nishino
?
ハードウェアによる仮想化支援机能を利用したハイパバイザー滨笔厂
ハードウェアによる仮想化支援机能を利用したハイパバイザー滨笔厂
FFRI, Inc.
?
奥颈苍诲辞飞蝉のパケットモニタ作成
奥颈苍诲辞飞蝉のパケットモニタ作成
Shinichi Hirauchi
?
Cloud TPU Driver API ソースコード解析
Cloud TPU Driver API ソースコード解析
Mr. Vengineer
?
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット?アンワル
Androsia:一歩先のメモリ内Androidアプリケーションデータの保護 by サミット?アンワル
CODE BLUE
?
Composable Callbacks & Listeners
Composable Callbacks & Listeners
Taisuke Oe
?
贰尝贵の动的リンク
贰尝贵の动的リンク
7shi
?
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
Mr. Vengineer
?
顿叠贵濒耻迟别2017フェス尝罢资料
顿叠贵濒耻迟别2017フェス尝罢资料
shogokataoka
?
痴别谤颈濒补迟辞谤と厂测蝉迟别尘颁
痴别谤颈濒补迟辞谤と厂测蝉迟别尘颁
Mr. Vengineer
?
Introduction of Python
Introduction of Python
Tomoya Nakayama
?
What is Metasepi?
What is Metasepi?
Kiwamu Okabe
?
/etc/network/interfaces について
/etc/network/interfaces について
Kazuhiro Nishiyama
?
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
Fujio Kojima
?
Kobe.R #15 - Incanter ????????
Kobe.R #15 - Incanter ????????
tnoda
?
翱辫别苍贵濒辞飞で覚えるネットワーク
翱辫别苍贵濒辞飞で覚えるネットワーク
M Hagiwara
?
奥颈谤别蝉丑补谤办で検出できないチャットプログラム
奥颈谤别蝉丑补谤办で検出できないチャットプログラム
Shinichi Hirauchi
?
TensorFlow White Paperを読む
TensorFlow White Paperを読む
Yuta Kashino
?
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
「辫濒测谤パッケージで君も前処理スタ☆」改め「辫濒测谤パッケージ彻底入门」
Nagi Teramo
?
Nio2
Nio2
Appresso Engineering Team
?
○○大学の本当にあった怖い话
○○大学の本当にあった怖い话
idkqh7 Nishino
?
Similar to debugging server with strace
(20)
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
Yohei Azekatsu
?
奥别产サーバのチューニング
奥别产サーバのチューニング
Yu Komiya
?
2010/12/10の勉強会で発表。 主催者ページ↓ http://d.hatena.ne.jp/oranie/20101212
How to read linux kernel
How to read linux kernel
Naoya Ito
?
シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法
Yohei Azekatsu
?
性能問題は交通渋滞と同じ 渋滞を見つけて原因を特定する方法 CPU編 メモリ編 ディスク編 参考情報
Pythonista も ls を読むべきか?
Pythonista も ls を読むべきか?
Katsunori FUJIWARA
?
Python Developers Festa 2013.11 での発表資料です。 https://github.com/pyspa/pyfes/blob/develop/201311.rst 性能計測結果は Solaris 系の OpenIndiana 151a 上で実施したものですので、他の OS の場合は異なる傾向となる可能性もあります。
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
Yohei Azekatsu
?
JPOUG in 15 minutes #9 でLTしたスライドです。dstat、htop などモダンなツールや strace、sysdig、perf など深掘りするツールを使わずに mpstat、top、free、iostat など古典的なツールを使った基本的な Linux パフォーマンス分析手法を紹介します。
システムパフォーマンス勉强会#5
システムパフォーマンス勉强会#5
shingo suzuki
?
社内システムパフォーマンス勉強会の第5回 詳解システム?パフォーマンス 6 章 CPUの話
スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe
?
第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版
Ryosuke MATSUMOTO
?
自分のこれまでの研究成果と尘辞诲冲辫谤辞肠别蝉蝉冲蝉别肠耻谤颈迟测についての復习。
Functions
Functions
do_aki
?
CentOS5.6 の /etc/rc.d/init.d/functions ぜん27
贵补产谤颈肠でサーバー管理を顿搁驰にしよう
贵补产谤颈肠でサーバー管理を顿搁驰にしよう
max747
?
kyoto.py in 高槻
Subprocess no susume
Subprocess no susume
Makoto Kishimoto
?
3分でサーバオペレーションコマンドを作る技术
3分でサーバオペレーションコマンドを作る技术
Kei IWASAKI
?
#pyconjp 2015 の LTで発表した際に利用した資料です https://pycon.jp/2015/ja/schedule/presentation/93/
the study of monit
the study of monit
Tadayasu Yotsu
?
This is my memo when I study monit.
狈辞诲别.箩蝉入门
狈辞诲别.箩蝉入门
俊夫 森
?
Unix architecture
Unix architecture
raw-hide
?
鲍狈滨齿の歴史から始まり、翱厂の基本的な机能の説明やカーネルとおしゃべりするためのシステムコールなどについての内容です!
SystemV IPC
SystemV IPC
Masami Ichikawa
?
Linux SystemV IPC
奥颈苍诲辞飞蝉でも使えるシェル
奥颈苍诲辞飞蝉でも使えるシェル
Tetsuya Hasegawa
?
Windowsで使っている日常業務用の汎用的に使えるシェル。 解説付き。 cygwin、sed、awk、xargs、sort、powershellなど。
Kyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in Japanese
Mikio Hirabayashi
?
狠狠撸
狠狠撸
Kazki Matsumoto
?
Dbts2012 unconference wttrw_yazekatsu_publish
Dbts2012 unconference wttrw_yazekatsu_publish
Yohei Azekatsu
?
奥别产サーバのチューニング
奥别产サーバのチューニング
Yu Komiya
?
How to read linux kernel
How to read linux kernel
Naoya Ito
?
シンプルでシステマチックな Linux 性能分析方法
シンプルでシステマチックな Linux 性能分析方法
Yohei Azekatsu
?
Pythonista も ls を読むべきか?
Pythonista も ls を読むべきか?
Katsunori FUJIWARA
?
Linux Performance Analysis in 15 minutes
Linux Performance Analysis in 15 minutes
Yohei Azekatsu
?
システムパフォーマンス勉强会#5
システムパフォーマンス勉强会#5
shingo suzuki
?
スタート低レイヤー #0
スタート低レイヤー #0
Kiwamu Okabe
?
第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版
Ryosuke MATSUMOTO
?
Functions
Functions
do_aki
?
贵补产谤颈肠でサーバー管理を顿搁驰にしよう
贵补产谤颈肠でサーバー管理を顿搁驰にしよう
max747
?
Subprocess no susume
Subprocess no susume
Makoto Kishimoto
?
3分でサーバオペレーションコマンドを作る技术
3分でサーバオペレーションコマンドを作る技术
Kei IWASAKI
?
the study of monit
the study of monit
Tadayasu Yotsu
?
狈辞诲别.箩蝉入门
狈辞诲别.箩蝉入门
俊夫 森
?
Unix architecture
Unix architecture
raw-hide
?
SystemV IPC
SystemV IPC
Masami Ichikawa
?
奥颈苍诲辞飞蝉でも使えるシェル
奥颈苍诲辞飞蝉でも使えるシェル
Tetsuya Hasegawa
?
Kyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in Japanese
Mikio Hirabayashi
?
狠狠撸
狠狠撸
Kazki Matsumoto
?
Ad
debugging server with strace
1.
debugging server with strace Yoshinari
Takaoka @mumumu
2.
Agenda ● 自己绍介 ● strace
basic ● システムコールについて ● straceによるサーバデバッグの勘所 ● まとめ アプリケーションエンジニアであっても、 strace によ るサーバのデバッグをわかった気になることが目標
3.
自己绍介
4.
自己绍介(1) ● Yoshinari Takaoka
@mumumu ● ソフトウェアエンジニア Java で Webアプリ → 組込みソフト屋 → EC屋 → 現職 ● 広島県出身
5.
自己绍介(2) ● C, C++,
Java, JavaScript, PHP, Python ● Linux (Red Hat, Debian, KDE) ● Translator, PHP Manual Maintainer http://producingoss.com/ http://www.oreilly.co.jp/books/9784873114125/
6.
strace basic
7.
strace って? (1) ●
system call tracer for Linux http://sourceforge.net/projects/strace/ 実行中のソフトウェアが呼び出している「システム コール」をリアルタイムに追いかけられるツール
8.
システムコール?
9.
システムコールって? (1) ● 特権が必要なCPU命令の実行を
kernel 様にお願 いするための仕組み ハードウェア操作 割り込み … etc ● ユーザー視点だとただのC言語の関数呼び出し kernel の機能(サービス)を呼び出す関数と言い換 えてもよい http://www.atmarkit.co.jp/ait/articles/1111/16/news161.html
10.
strace って? (2) ●
system call tracer for Linux http://sourceforge.net/projects/strace/ 実行中のソフトウェアの(kernelの機能を実行している) 関数呼び出しをリア ルタイムに追いかけられるツール ● 追いかけられる関数の出力はC言語の形式 ● 対象とするソフトウェアの動きを無停止で見ることができる サーバの障害解析 アプリレベルでのボトルネックの調査 ...などに重宝 …. 要するにデバッグツール。
11.
Demo sudo strace -T
-tt -p XX -f -e trace=network,file,read,write ● 上記を実際にやってみる ● 実行中のプロセスにアタッチできる ● 出力される1行1行がシステムコール ● けど多分1行1行が何がなんだかわかんない → システムコールをもっと知る必要がある
12.
システムコールって?(2) ● システムコールは kernel
の機能を呼び出すための関数呼び 出し ● Linux のシステムコールは2.6系でも300位ある ここでは、サーバのデバッグに役立つものを解説 [クライアント|サーバ] の基本的な動きを知っておくとわかりや すい (Unixプログラミングに親しむと尚良い) ● 知らないシステムコールは... 「manpage of システムコール名」でググるか Linux上で 「man 2 システムコール名」
13.
サーバの基本的な動き int sock =
socket(PF_INET, SOCK_STREAM); bind(sock, addr); listen(sock); while(1) { // 確立済みの接続を取り出す int new_sock = accept(sock, &addr); char buf[1024] // クライアントから読む(受信) size_t size = read(new_sock, buf, 1024); if (size == 0) { close(sock); // 送信がなければ何もしない } else { // クライアントに書く(送信) write(new_sock, buf, size); } }
14.
クライアントの基本的な動き int sock =
socket(PF_INET, SOCK_STREAM); connect(sock, addr); // 接続 write(sock, “ping”); // サーバに送信 char response[100]; read(sock, response, 100); // サーバから受信
15.
基本的なシステムコール(ネットワーク) ● ソケットを作る/接続する(クライアント) socket /
connect ● ポートで接続を待つ / 確立した接続をソケットとして取得(サーバ) listen / accept ● ソケットから何か読む(受信) recv / recvfrom / recvmsg / read系関数 ... etc ● ソケットに何か書く(送信) send / sendto / sendmsg / write系関数 ... etc
16.
基本的なシステムコール(ネットワーク)(2) ● ソケットの状態変化を待つ select/poll/epoll_wait …
etc ● 接続を閉じる shutdown/close ... etc
17.
基本的なシステムコール(ファイル) ● ファイルを開く/閉じる open /
close ● ファイルの様子を見る stat / fstat / lstat ... etc ● ファイルから何か読む read / readv / pread / preadv ... etc ● ファイルに何か書く write / writev / pwrite / pwritev ... etc
18.
基本的なシステムコール(その他) ● ファイルディスクリプタをいろいろ操作 fcntl /
ioctl / epoll_ctl … etc ● メモリ関係 mmap / munmap ...etc ● 時刻を取得 gettimeofday … etc
19.
番外編: ファイルディスクリプタについて ● ファイルやソケットを開いたとき、それらを識別する0 以上の数値をファイルディスクリプタ(記述子)と呼ぶ int
fd = open(“hoge.txt”, O_RDONLY); ssize_t readbyte = read(fd, buffer, byte); ファイルやソケットに読み書きするときは、このファイル ディスクリプタが必ず引数になる。 このことが、strace の出力を読むときに重要な手が かりになる。
20.
よく使うstraceの コマンドラインオプション
21.
strace のオプション(1) ● 以下を覚えておけば実戦である程度困らない ●
詳しくは man strace -tt マイクロ秒単位のタイムスタンプを付加 -T 各システムコールにかかった時間を記録 -p アタッチするプロセスIDを指定
22.
straceのオプション(2) -f fork した子[プロセス|スレッド]も追跡する -e trace=XXX 追跡するシステムコールや追跡の仕方を指定。 これで情報が不足するようなら指定せずに試してみる 例)
-e trace=network, file, read, write ファイルとネットワーク系のシステムコールを 追跡する。よく使います
23.
straceのオプション(3) -o filename 標準エラー出力(デフォルト)ではなく、ファイル にトレースを出力する 高トラフィックのサーバだとすぐにサイズが巨大に なるので取扱注意。
24.
これでstraceの基礎は ばっちり!(`ー?)
25.
straceによるサーバ デバッグの勘所
26.
勘所は4つ ● 読みづらいので、出力を読むコツをつかむ ● 子プロセスに根気よく実行 ●
異常なシステムコールの戻り値に注目 ● 遅い、または詰まった動きに注目
27.
strace の出力を読むコツ ● はじめと終わりをつかむ ●
同じファイルディスクリプタを追う ● アプリの動きを知ってなくても読めるが、知っていた 方が流れを推測しやすい
28.
はじめと終わりをつかむ ● Webサーバの場合、はじめは接続をaccept してリ クエストの中身を受け取るところから 終わりはレスポンスを返すところ ●
HTMLを吐く部分とか。QUERY_STRING とかある 部分とか。いろいろ。
29.
はじめと終わりをつかむ 23:44:43.704135 read(8, "f0QUERY_STRINGT2u=hogehoge...."..., 2648)
= 2648 <0.000015> … snip 23:44:43.798581 writev(8, [{"HTTP/1.1", 8}, {" ", 1}, {"200 OK", 6}, {"rn", 2}, {"Content-Type", 12}, {": ", 2}, {"text/html; charset=utf-8", 24}, {"rn", 2}, {"P3P", 3}, {": ", 2}, {"rn", 2}, {"Pragma", 6}, {": ", 2}, {"no-cache", 8}, {"rn", 2}, {"Cache-Control", 13}, {": ", 2}, {"private, no-cache, no-cache="Set"..., 58}, {"rn", 2}, {"Set-Cookie", 10}, {": ", 2}, {"rn", 2}, {"rn", 2}], 25) = 281 <0.000030> 23:44:43.798747 write(8, "<html><head><style>html,body{mar"..., 1641) = 1641 <0.000022>
30.
同じファイルディスクリプタを追う ● 同じファイルディスクリプタを使っているトレースは 一連の処理。 ● 複数のリクエストのトレースが錯綜する中で、ファイ ルディスクリプタは有用な手段
31.
同じファイルディスクリプタを追う(2) 23:31:15.410761 sendto(15, "rn$7rnhoge
foo barrn$44rnfoo.bar.s"..., 68, 0, NULL, 0) = 68 <0.000022> 23:31:15.410829 recvfrom(15, "hogehogern", 4096, 0, NULL, NULL) = 4 <0.000263> 23:31:15.412355 sendto(16, "*2rn$7rhoge foo barrn$44rnhogehoge.s"..., 68, 0, NULL, 0) = 68 <0.000021> 23:31:15.412422 recvfrom(16, "*0rn", 4096, 0, NULL, NULL) = 4 <0.000350> 23:31:15.413929 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 49 <0.001255> 23:31:15.415271 connect(49, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("XXX.XXX.XXX.XXX")}, 16) = -1EINPROGRESS (Operation now in progress) <0.000026> 2:31:15.415705 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 50 <0.000016> 3:31:15.415798 connect(50, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("XXX.XXX.XX.XX")}, 16) = -1 EINPROGRESS (Operation now in progress) <0.000030> 23:31:15.418609 getsockopt(49, SOL_SOCKET, SO_ERROR, [127367220803141632], [4]) = 0 <0.000011> 23:31:15.418672 getpeername(49, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("XX.XX.XX.XX")}, [12703950620852240]) = 0 <0.000010> 23:31:15.418715 getsockname(49, {sa_family=AF_INET, sin_port=htons(38568), sin_addr=inet_addr("XX.XX.XX.X")}, [12147897053468426256]) = 0 <0.000008> 23:31:15.418859 sendto(49, "POST /hoge HTTP/1.1rnHost: hoge"..., 818, MSG_NOSIGNAL, NULL, 0) = 818 <0.000025> 23:31:15.419129 getsockopt(50, SOL_SOCKET, SO_ERROR, [127238371784261632], [4]) = 0 <0.000009> 23:31:15.419184 getpeername(50, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("XXX.XX.XX.XX")}, [12703950620852240]) = 0 <0.000008> 23:31:15.419224 getsockname(50, {sa_family=AF_INET, sin_port=htons(50707), sin_addr=inet_addr("XXX.XXX.XX.X")}, [1424826340699275280]) = 0 <0.000009> 23:31:15.419435 sendto(50, "POST /?foo=bar HTTP/1.1rnHos"..., 759, MSG_NOSIGNAL, NULL, 0) = 759 <0.000020> 23:31:15.435741 recvfrom(49, "HTTP/1.1 204 No Contentrn"..., 16384, 0, NULL, NULL) = 305 <0.000011> 23:31:15.440848 recvfrom(50, "HTTP/1.1 200 OKrnServer: ...."..., 16384, 0, NULL, NULL) = 822 <0.000012>
32.
子プロセスに根気よく実行 ● サーバの親プロセスは基本fork(spawn)するのが 役目なので、子プロセスのプロセスID を
-p に指定 それでもプロセスやスレッドの忙しさにムラがあるな どの理由でなかなか動きが把握しづらい場合も多 い (うまい方法ないですかね....) おかしな動きが見つかったらラッキーくらいの気楽 な気持ちで実行するのが吉
33.
子プロセスに根気よく実行 www-data 6331 681
0 14:54 ? 00:00:04 /usr/sbin/apache2 -k start www-data 7260 681 0 15:23 ? 00:00:02 /usr/sbin/apache2 -k start www-data 8721 681 0 16:44 ? 00:00:02 /usr/sbin/apache2 -k start www-data 9221 681 0 17:11 ? 00:00:01 /usr/sbin/apache2 -k start www-data 11497 681 0 19:12 ? 00:00:00 /usr/sbin/apache2 -k start www-data 11500 681 0 19:12 ? 00:00:00 /usr/sbin/apache2 -k start www-data 11967 681 0 19:30 ? 00:00:00 /usr/sbin/apache2 -k start www-data 11968 681 0 19:30 ? 00:00:00 /usr/sbin/apache2 -k start www-data 15708 681 0 8月23 ? 00:00:16 /usr/sbin/apache2 -k start www-data 17784 681 0 8月24 ? 00:00:08 /usr/sbin/apache2 -k start www-data 18109 681 0 8月28 ? 00:00:06 /usr/sbin/apache2 -k start www-data 18885 681 0 10月10 ? 00:00:15 /usr/sbin/apache2 -k start www-data 20943 681 0 01:14 ? 00:00:15 /usr/sbin/apache2 -k start www-data 26089 681 0 8月28 ? 00:00:09 /usr/sbin/apache2 -k start www-data 27070 681 0 8月24 ? 00:00:09 /usr/sbin/apache2 -k start ●
34.
異常なシステムコールの戻り値に注目(1) ● システムコールが異常時に返す値は様々だ が、strace の出力にはエラー時に理由もついてくる ので、理由に注目。 ●
No such file or directory はよくある話 ● 普段のサーバ(アプリ)の動きを把握しておこう
35.
異常なシステムコールの戻り値に注目(2) [pid 15033] 04:39:44.457978
accept(4, 0x7ffff7b82700, [16902192126610112528]) = -1 EMFILE (Too many open files) [pid 15033] 04:39:44.458035 open("/var/log/hoge/hoge.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = -1 EMFILE (Too many open files) [pid 15033] 04:39:44.458071 write(493, "foobarrn"..., 115) = 115 [pid 15033] 04:39:44.458110 epoll_ctl(3, EPOLL_CTL_MOD, 493, {EPOLLIN, {u32=493, u64=493}}) = 0 [pid 15033] 04:39:44.458139 read(361, "hogefugarn"..., 16384) = 68 [pid 15033] 04:39:44.458171 epoll_ctl(3, EPOLL_CTL_MOD, 361, {EPOLLIN|EPOLLOUT, {u32=361, u64=361}}) = 0 [pid 15033] 04:39:44.458201 epoll_wait(3, {{EPOLLIN, {u32=4, u64=4}}, {EPOLLOUT, {u32=361, u64=361}}, {EPOLLIN, {u32=190, u64=190}}}, 10240, 8) = 3 [pid 15033] 04:39:44.458231 accept(4, 0x7ffff7b82700, [16902192126610112528]) = -1 EMFILE (Too many open files) [pid 15033] 04:39:44.458274 open("/var/log/hoge/hoge.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = -1 EMFILE (Too many open files) [pid 15033] 04:39:44.458311 write(361, "hogehogern", 4) = 4 [pid 15033] 04:39:44.458369 epoll_ctl(3, EPOLL_CTL_MOD, 361, {EPOLLIN, {u32=361, u64=361}}) = 0 [pid 15033] 04:39:44.458416 read(190, "hogehogern"..., 16384) = 160 [pid 15033] 04:39:44.458460 epoll_ctl(3, EPOLL_CTL_MOD, 190, {EPOLLIN|EPOLLOUT, {u32=190, u64=190}}) = 0 [pid 15033] 04:39:44.458513 epoll_wait(3, {{EPOLLIN, {u32=4, u64=4}}, {EPOLLOUT, {u32=190, u64=190}}, {EPOLLIN, {u32=493, u64=493}}}, 10240, 8) = 3 [pid 15033] 04:39:44.458548 accept(4, 0x7ffff7b82700, [16902192126610112528]) = -1 EMFILE (Too many open files) [pid 15033] 04:39:44.458582 open("/var/log/hoge/hoge.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = -1 EMFILE (Too many open files) [pid 15033] 04:39:44.458613 write(190, "hogehogern", 5) = 5
36.
遅い、または詰まった動きに注目(1) ● Operation now
in Progress とか <unfinished …> という類のメッセージが同じ処理でくり返されてお り、処理が進んでいないようなら要注目 ● リアルタイムで見ていると、川のように流れているト レースが一瞬詰まる瞬間が見つかることも。
37.
遅い、または詰まった動きに注目(2) [pid 22331] 03:55:56.482860
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 9 [pid 22331] 03:55:56.483255 connect(9, {sa_family=AF_INET, sin_port=htons(XXXX), sin_addr=inet_addr("127.0.0.1")}, 16) = 0 [pid 22331] 03:55:56.483406 sendto(9, "hogehogern", 23, 0, NULL, 0) = 23 [pid 22331] 03:55:56.483469 recvfrom(9, "+foobarrn", 4096, 0, NULL, NULL) = 5 ....snip [pid 22331] 03:55:56.487400 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 13 [pid 22331] 03:55:56.487635 connect(13, {sa_family=AF_INET, sin_port=htons(XXXX), sin_addr=inet_addr("XX.XX.XX.XX")}, 16) = -1 EINPROGRESS (Operation now in progress) [pid 22331] 03:55:56.487873 getsockopt(13, SOL_SOCKET, SO_ERROR, [153356102270976000], [4]) = 0 [pid 22331] 03:55:56.487931 sendto(13, "hogehogehogehoge"..., 61, 0, NULL, 0) = 61 [pid 22331] 03:55:56.488534 recvfrom(13, "fugafugafugafuga"..., 4096, 0, NULL, NULL) = 76 [pid 22331] 03:55:56.488633 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 14 [pid 22331] 03:55:56.488855 connect(14, {sa_family=AF_INET, sin_port=htons(XXXX), sin_addr=inet_addr("XX.XX.XX.XX")}, 16) = -1 EINPROGRESS (Operation now in progress) [pid 22331] 03:55:56.488987 getsockopt(14, SOL_SOCKET, SO_ERROR, [153356102270976000], [4]) = 0 [pid 22331] 03:55:56.489039 sendto(14, "foobarrn"..., 59, 0, NULL, 0) = 59 [pid 22331] 03:55:56.489353 recvfrom(14, "hogehogern"..., 4096, 0, NULL, NULL) = 73 [pid 22331] 03:55:56.491714 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 15 [pid 22331] 03:55:56.491986 connect(15, {sa_family=AF_INET, sin_port=htons(XXXX), sin_addr=inet_addr("XX.XX.XX.XX")}, 16) = 0 [pid 22331] 03:55:56.492135 sendto(15, "foobarn"..., 51, 0, NULL, 0) = 51 [pid 22331] 03:55:56.492177 recvfrom(15, <unfinished ...>
38.
遅い、または詰まった動きに注目(3) ● タイムスタンプを見てどう見ても遅いものも注意 ● サーバなので、応答をちゃんと返せているかも注目 [pid
1710] 14:06:19.006556 futex(0x619064, FUTEX_WAIT_PRIVATE, 17, NULL <unfinished ...> [pid 1709] 14:06:19.006627 futex(0x619b60, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...> [pid 1708] 14:06:19.006645 futex(0x619b60, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...> [pid 1706] 14:06:19.006662 futex(0x619b60, FUTEX_WAIT_PRIVATE, 2, NULL <unfinished ...>
39.
まとめ ● strace は無停止でのデバッグに重宝 動きが変なサーバを見つけたら
strace してみる 変なのが見つかればラッキーくらいのつもりで ● 基本的なシステムコールを把握しよう ● よく使うオプションは限られている ● 出力を読むには少しコツがいるが、勘所をおさ えれば大丈夫
40.
Questions?
Download