Prog/debug/memory
の編集
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
App
App/archiver
App/audio
App/audio/audacity
App/audio/mpg321
App/audio/puddletag
App/base64
App/Browser
App/column
App/diff-patch
App/downloader
App/ffmpeg
App/ffprobe
App/find
App/gimp
App/gnuplot
App/ImageMagick
App/info
App/inxi
App/LibreOffice
App/locate
App/md5
App/Music
App/Music/frescobaldi
App/Music/MuseScore
App/OCR
App/od
App/OpenOffice.org
App/pagers
App/pdf
App/QRコード
App/ripgrep
App/screen
App/script
App/sed
App/selenium
App/signal-desktop
App/skype
App/sylpheed
App/tmux
App/ttyrec
App/uniq
App/UUID
App/wget
App/xargs
App/テキスト処理
App/仮想化
App/仮想化/Docker
App/仮想化/qemu
App/仮想化/webos
AutoTicketLinkName
BracketName
CentOS
CentOS/yum
CrossCompile
Debian
Debian/kernel
Debian/kernel/ver8-or-older
Debian/Plan9関連
Debian/ver5
Debian/ver6
Debian/ver7
Debian/ver8
Debian/ver9
Debian/ver10
Debian/ver11
Debian/ver12
Debian/X
Debian/X/日本語
Debian/パッケージ管理
Deveice/Sensor/MotionSensor
Device
Device/Mouse
Device/Net/wifi
Device/Scanner
Device/Sensor
Device/Sensor/MotionSensor
Device/tty
Device/xmodmap
Editor
Editor/atom
Editor/binary
Editor/binary/beav
Editor/binary/hexedit
Editor/emacs
Editor/emacs/clang-format
Editor/emacs/flycheck
Editor/emacs/gdb-mode
Editor/emacs/github/copilot
Editor/emacs/html-mode
Editor/emacs/lisp
Editor/emacs/lsp-mode
Editor/emacs/markdown-mode
Editor/emacs/neotree
Editor/emacs/package-install
Editor/emacs/sdic
Editor/emacs/speedbar
Editor/emacs/XEmacs
Editor/emacs/ローカルビルド
Editor/emacs/多言語
Editor/fte
Editor/vi
FormattingRules
FrontPage
Help
InterWiki
InterWikiName
InterWikiSandBox
iPhone
Lang
Lang/C++
Lang/C++/Boost
Lang/C++/C++11
Lang/C++/C++11/thread
Lang/C++/C++11/コンテナ
Lang/C++/C++11/コンテナ/string
Lang/C++/C++11/初期化子
Lang/C++/C++17
Lang/C++/C++20
Lang/C++/error
Lang/C++/macro
Lang/C++/template
Lang/C++/コンテナ
Lang/C++/処理系
Lang/C-Sharp
Lang/Go
Lang/html
Lang/html/5
Lang/html/5/canvas
Lang/html/css
Lang/Java
Lang/Java/jar
Lang/Objective-C
Lang/Pascal
Lang/Perl
Lang/Perl/CGI
Lang/Perl/thread
Lang/Perl/utf-8
Lang/pike
Lang/Python
Lang/Python/Class
Lang/Python/Error
Lang/Python/import対象パス
Lang/Python/pip
Lang/Python/基本文法
Lang/Python/開発環境
Lang/Rust
Lang/sed
Lang/shell
Lang/shell/bash
Lang/shell/bash/設定
Lang/shell/bash/設定/command-not-found
Lang/Tcl_Tk_Expect
Lang/Tcl_Tk_Expect/Ctrl-キーマップ
Lang/TypeScript
Lang/xml
Mac
Memo
memo
MenuBar
midi
Multimedia
Net
Net/apache
Net/apache2
Net/dig
Net/dns/server
Net/domain
Net/http/アクセス制御
Net/iptables
Net/IRC
Net/Jenkins
Net/lighttpd
Net/mail
Net/mail/X-Face
Net/news
Net/news/gnus
Net/ntp
Net/pukiwiki
Net/pukiwiki/plugin
Net/resolv.conf
Net/SPAM
Net/ss
Net/tcpdump
Net/traceroute
Net/twitter
Net/vpn
Net/web
Net/webAPI
Net/wifi
Net/wifi/AP
Net/監視
otherlinks
PHP
Plan9
PPC
PPC/LinuxPPC
PPC/MkLinux
Prog
Prog/AI
Prog/autotools
Prog/cmake
Prog/Compiler/gcc
Prog/CrossReferencer
Prog/debug
Prog/debug/gdb
Prog/debug/lldb
Prog/debug/ltrace
Prog/debug/memory
Prog/debug/strace
Prog/formatter/clang-format
Prog/GoogleTest
Prog/Gtk
Prog/IDE
Prog/IDE/Geany
Prog/ldd
Prog/make
Prog/nm
Prog/Profiler
Prog/Qt
Prog/readelf
Prog/Sound
Prog/StaticCodeAnalysis
Prog/StaticCodeAnalysis/cppcheck
Prog/strip
Prog/TagSystem
Prog/TagSystem/cscope
Prog/TagSystem/ctags-exuberant
Prog/TagSystem/ebrowse
Prog/TagSystem/etags
Prog/TagSystem/gtags
Prog/TagSystem/id-utils
Prog/TagSystem/lctags
Prog/TagSystem/rtags
Prog/TagSystem/SilentBob
Prog/X/X11
Prog/プロセス間通信
Prog/プロセス間通信/SharedMemory
Prog/プロセス間通信/singal
Prog/人為的なシグナル
Prog/分散ビルド/distcc
Prog/逆アセンブル
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
RS232C
SandBox
Security
Security/aide
Security/chkrootkit
Security/clamav
Security/gpg
Security/pkcs
Security/ssh
Security/test
Security/パスワード解析
System
System/Audio
System/beep
System/bluetooth
System/cpu
System/dm-crypt
System/fs
System/fs/ext2-3
System/fs/mount
System/fs/nfs
System/fs/tmpfs
System/fs/xfs
System/fs/大容量のファイルを高速に作成する
System/fs/強制物理フォーマット
System/grub
System/Hardware情報
System/HDD/IDE/チューニング
System/input
System/iostat
System/Kernel
System/Kernel/Module
System/locale
System/memory
System/OpenCL
System/os
System/power/battery
System/Process
System/random
System/rpm
System/runlevel
System/signal
System/sudo
System/swap
System/USB-Boot
System/user
System/シリアル接続
System/環境変数
TeX
TeX/MusiXTeX
tools
Top/Editor/emacs/python開発環境
transcription/old
Ubuntu
VersionCtl
VersionCtl/git
VersionCtl/git/Gerrit
VersionCtl/git/Gerrit/old
VersionCtl/git/git-gutter+
VersionCtl/git/git-imerge
VersionCtl/git/magit
VersionCtl/git/magit/2.1.0
VersionCtl/git/magit/2.8.0
VersionCtl/git/magit/2.13.1
VersionCtl/git/magit/v3.2.1
VersionCtl/git/magit/v3.3.0
VersionCtl/git/subversion からの移行
VersionCtl/git/subversion とのコマンド対比
VersionCtl/git/tig
VersionCtl/git/統計
VersionCtl/hg
VersionCtl/Mercurial
VersionCtl/repo
VersionCtl/Subversion
WikiEngines
WikiName
WikiWikiWeb
Windows
Windows/cmd
X
X/DisplayManager
X/DisplayManager/gdm3
X/DisplayManager/lightdm
X/font
X/font/old
X/GNOME3
X/input
X/input/OnScreenKeyboard
X/input/キーアサインを変更する
X/input/グラゴル文字
X/input/日本語
X/input/日本語/ATOK X3
X/input/日本語/ibus
X/input/日本語/uim
X/KDE
X/remote
X/screensaver
X/terminal
X/terminal/mlterm
X/terminal/urxvt
X/terminal/uxterm
X/vnc
X/vnc/tigervnc
X/WindowManager
X/WindowManager/9wm
X/WindowManager/amiwm
X/WindowManager/awesome
X/WindowManager/CDE
X/WindowManager/cinnamon
X/WindowManager/dwm
X/WindowManager/flwm
X/WindowManager/i3
X/WindowManager/jwm
X/WindowManager/matchbox
X/WindowManager/MATE
X/WindowManager/mlvwm
X/WindowManager/qvwm
X/WindowManager/ratpoison
X/WindowManager/ude
X/WindowManager/WindowMaker
X/WindowManager/xfce4
X/xdotool
X/Xnest
X/xrdp
X/xvfb
YukiWiki
スタジオ・ホール
旅
旅/Czech
旅/三重
旅/京都・滋賀
旅/兵庫
旅/千葉
旅/各務
旅/和歌山
旅/埼玉
旅/山形
旅/岐阜
旅/岡山
旅/岩手
旅/島根
旅/愛媛
旅/新潟
旅/東京
旅/栃木
旅/神奈川
旅/秋田
旅/群馬
旅/茨城
旅/長野・山梨
旅/静岡
旅/静岡/伊豆
未整理
食
食/チェコ
食/各国
食/料理
食/激辛
食/蕎麦
食/郷土料理
#topicpath ////////////////////////////////////////////////////////////////////////////// * 目次 [#d012f75f] #contents(); ////////////////////////////////////////////////////////////////////////////// * バッファオーバーフロー [#buffer-overflow] //============================================================================ ** -D_FORTIFY_SOURCE で検出する (GCC) [#fortify_source] - GCC の "Automatic Fortification" 機能を使って、バッファオーバーフローを起こしやすいとされている関数(gets, strcpy, memcpy など)の誤使用をコンパイル時・実行時に検出する //---------------------------------------------------------------------------- *** 使い方 [#fortify_source-usage] - 下記のオプションを付加してコンパイルする: -O1 以上 -D_FORTIFY_SOURCE=1 - これにより、次の2つのタイミングでバッファオーバーフローの検出が行われる: |~チェックするタイミング |~チェック内容 | |コンパイル時 |コンパイル時にチェック可能な明らかなバッファオーバーフロー | |実行時 |上記以外のバッファオーバーフロー | - チェックの強化 -D_FORTIFY_SOURCE=1 を -D_FORTIFY_SOURCE=2 にすると、より厳しくチェエクされるようになる。 -- 一例として、format-string bug がランタイムに検出されるようになる。 --- printf, vfprintf, syslog などの関数が "%n" を含むフォーマット文字列を引数に取って呼ばれると abort する。 //---------------------------------------------------------------------------- *** チェックされる関数の一覧 [#fortify_source-check-target] - 下記コマンドで一覧を取得出来る: $ grep -r "_chk" /usr/include/ | sed 's/.*\(__.*chk\).*/\1/' | sort | uniq //=============================================================================== ** Mudflap (GCC) [#mudflap] - Mudflap は -- GCC4 に新規実装されたデバッグ補助機能(よって、GCC4以上が動作する環境であれば、どこででも動く) -- C/C++ に対応している - 以下を検出出来る: -- バッファオーバーフロー -- メモリリーク -- ヌルポインタ参照 -- その他、ポインタの誤使用 //---------------------------------------------------------------------------- *** 使い方 [#mudflap-usage] + ビルド - ''-g'' ''-fmudflap'' を付与してコンパイルする -- マルチスレッドプログラムの場合は、''-fmudflapth'' を付与する - ''-lmudflap'' を付けてリンクする -- マルチスレッドプログラムの場合は、 ''-lmudflapth'' を付与する - ビルド時に "mf-runtime.h が見つからない" 、或いは "libmudflap が見つからない" とエラーが出る場合は、パッケージの追加が必要。 + 実行 -- 出来上がったプログラムを通常通り実行する。Mudflap によりチェックが行われ、エラーメッセージは stderr に出力される。 -- 一時的気に Mudflap を無効にしたい場合は、環境変数 MUDFLAP_OPTIONS を変更する $ MUDFLAP_OPTIONS="-mode-nop" <target-test-program> //============================================================================ ** -fstack-protector オプションによるスタックオーバーフローの検出 (GCC) [#SPP] - C/C++ コードを gcc のオプションとして ''-fstack-protector'' を付けてコンパイルすると、 SPP [stack-smashing protector] 機能が有効になり、スタックオーバーフローの検出が出来る。 - SPP によりバッファオーバーフローが検出されるのは、実行時。 - SPP によりバッファオーバーフローが検出されると、プログラムが abort する。 - SPP よって検出出来るのは、以下: -- バッファオーバーフローによるローカル変数(特にポインタ)の改竄 -- バッファオーバーフローによる return address や saved ebp の改竄 - SPP は、スタックレイアウトの調整を行い、通常の gcc でコンパイルされた場合とは異なるものにする。 - SPP と [[-D_FORTIFY_SOURCE=1>#fortify_source]] は併用しても構わない。 //============================================================================ ** AddressSanitizer でのバッファオーバーフローの検出 (clang) [#AddressSanitizer] - clang でコンパイルする際に、 "-g -fsanitize=address -fno-omit-frame-pointer" を付けることで、実行時にバッファオーバーフローを検査出来る。 ////////////////////////////////////////////////////////////////////////////// * メモリリーク [#memory-leak] //=============================================================================== ** valgrind [#valgrind] //------------------------------------------------------------------------------- *** 使い方 [#valgrind-usage] + ビルドする -- ''-g'' 又は ''--ggdb'' 付きにすること -- 最適化は最大でも -O1 までにしておくこと -- static link は避けること。これは、malloc などの関数を valgrind が置き換えられなくなる為。 + 下記コマンドで実行する $ valgrind --tool=memcheck --leak-check=yes <program-file-name> または $ valgrind --leak-check=full --leak-resolution=high --show-reachable=yes <program-file-name> //------------------------------------------------------------------------------- *** vgcore [#valgrind-vgcore] - coredump した場合、 vgcore.<PID> という名前でファイルを出力する。 - vgcore は、通常の core と同様、 gdb に読み込ませて解析に使用出来る。 //------------------------------------------------------------------------------- *** 特徴 [#valgrind-feature] - スレッドセーフである - プロセス全体の起動から終了までを調べることしか出来ないため、部分的な検査は面倒になる。 //------------------------------------------------------------------------------- *** valgrind で検出できないもの [#valgrind-undetect-errors] - valgrind はスタック上に確保されたメモリ、data/bas 領域のメモリの不正なアクセスは検出しない → [[4.6. Why doesn't Memcheck find the array overruns in this program?>http://valgrind.org/docs/manual/faq.html#faq.overruns]] -- これを検出するには、Mudflap を使う必要がある。 //=============================================================================== ** mtrace [#mtrace] //------------------------------------------------------------------------------- *** 使い方 [#mtrace-usage] + ヘッダをインクルードする #include <mcheck.h> + リークのテストを開始したい場所で ''mtrace()'' をコール + 終了したい場所で ''muntrace()'' をコールする + ''-g'' つきでコンパイル + 環境変数 ''MALLOC_TRACE'' を export する # export MALLOC_TRACE=<log-file-name> + プログラムを実行する - ${MALLOC_TRACE} に出力されたログの例 = Start @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049a98 0x1 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049aa8 0x1 @ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x400b0de3] - 0x8049aa8 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049ab8 0x64 = End ~ ここで、 + は new - は delete + 以下の環境変数を指定することでメモリ領域の破壊などについてはデバッグしやすくなるかもしれません。 export MALLOC_CHECK_=”値” 値は0〜3です。 MALLOC_CHECK_ = 0 何もしない MALLOC_CHECK_ = 1 標準エラー出力に診断メッセージ表示 MALLOC_CHECK_ = 2 abort MALLOC_CHECK_ = 3 1と2の両方 //------------------------------------------------------------------------------- *** 特徴 [#mtrace-feature] - スレッドセーフではない - ソース内でどこからどこの間でリークを調べたいかを指定できる //=============================================================================== ** 参考リンク [#links] - [[メモリーリークの検出:mtrace , valgrind>http://blogs.itmedia.co.jp/komata/2009/10/mtrace-valgrind.html]] - [[メモリーリーク調査方法>http://www.nianyan.net/library/memory.html]]
#topicpath ////////////////////////////////////////////////////////////////////////////// * 目次 [#d012f75f] #contents(); ////////////////////////////////////////////////////////////////////////////// * バッファオーバーフロー [#buffer-overflow] //============================================================================ ** -D_FORTIFY_SOURCE で検出する (GCC) [#fortify_source] - GCC の "Automatic Fortification" 機能を使って、バッファオーバーフローを起こしやすいとされている関数(gets, strcpy, memcpy など)の誤使用をコンパイル時・実行時に検出する //---------------------------------------------------------------------------- *** 使い方 [#fortify_source-usage] - 下記のオプションを付加してコンパイルする: -O1 以上 -D_FORTIFY_SOURCE=1 - これにより、次の2つのタイミングでバッファオーバーフローの検出が行われる: |~チェックするタイミング |~チェック内容 | |コンパイル時 |コンパイル時にチェック可能な明らかなバッファオーバーフロー | |実行時 |上記以外のバッファオーバーフロー | - チェックの強化 -D_FORTIFY_SOURCE=1 を -D_FORTIFY_SOURCE=2 にすると、より厳しくチェエクされるようになる。 -- 一例として、format-string bug がランタイムに検出されるようになる。 --- printf, vfprintf, syslog などの関数が "%n" を含むフォーマット文字列を引数に取って呼ばれると abort する。 //---------------------------------------------------------------------------- *** チェックされる関数の一覧 [#fortify_source-check-target] - 下記コマンドで一覧を取得出来る: $ grep -r "_chk" /usr/include/ | sed 's/.*\(__.*chk\).*/\1/' | sort | uniq //=============================================================================== ** Mudflap (GCC) [#mudflap] - Mudflap は -- GCC4 に新規実装されたデバッグ補助機能(よって、GCC4以上が動作する環境であれば、どこででも動く) -- C/C++ に対応している - 以下を検出出来る: -- バッファオーバーフロー -- メモリリーク -- ヌルポインタ参照 -- その他、ポインタの誤使用 //---------------------------------------------------------------------------- *** 使い方 [#mudflap-usage] + ビルド - ''-g'' ''-fmudflap'' を付与してコンパイルする -- マルチスレッドプログラムの場合は、''-fmudflapth'' を付与する - ''-lmudflap'' を付けてリンクする -- マルチスレッドプログラムの場合は、 ''-lmudflapth'' を付与する - ビルド時に "mf-runtime.h が見つからない" 、或いは "libmudflap が見つからない" とエラーが出る場合は、パッケージの追加が必要。 + 実行 -- 出来上がったプログラムを通常通り実行する。Mudflap によりチェックが行われ、エラーメッセージは stderr に出力される。 -- 一時的気に Mudflap を無効にしたい場合は、環境変数 MUDFLAP_OPTIONS を変更する $ MUDFLAP_OPTIONS="-mode-nop" <target-test-program> //============================================================================ ** -fstack-protector オプションによるスタックオーバーフローの検出 (GCC) [#SPP] - C/C++ コードを gcc のオプションとして ''-fstack-protector'' を付けてコンパイルすると、 SPP [stack-smashing protector] 機能が有効になり、スタックオーバーフローの検出が出来る。 - SPP によりバッファオーバーフローが検出されるのは、実行時。 - SPP によりバッファオーバーフローが検出されると、プログラムが abort する。 - SPP よって検出出来るのは、以下: -- バッファオーバーフローによるローカル変数(特にポインタ)の改竄 -- バッファオーバーフローによる return address や saved ebp の改竄 - SPP は、スタックレイアウトの調整を行い、通常の gcc でコンパイルされた場合とは異なるものにする。 - SPP と [[-D_FORTIFY_SOURCE=1>#fortify_source]] は併用しても構わない。 //============================================================================ ** AddressSanitizer でのバッファオーバーフローの検出 (clang) [#AddressSanitizer] - clang でコンパイルする際に、 "-g -fsanitize=address -fno-omit-frame-pointer" を付けることで、実行時にバッファオーバーフローを検査出来る。 ////////////////////////////////////////////////////////////////////////////// * メモリリーク [#memory-leak] //=============================================================================== ** valgrind [#valgrind] //------------------------------------------------------------------------------- *** 使い方 [#valgrind-usage] + ビルドする -- ''-g'' 又は ''--ggdb'' 付きにすること -- 最適化は最大でも -O1 までにしておくこと -- static link は避けること。これは、malloc などの関数を valgrind が置き換えられなくなる為。 + 下記コマンドで実行する $ valgrind --tool=memcheck --leak-check=yes <program-file-name> または $ valgrind --leak-check=full --leak-resolution=high --show-reachable=yes <program-file-name> //------------------------------------------------------------------------------- *** vgcore [#valgrind-vgcore] - coredump した場合、 vgcore.<PID> という名前でファイルを出力する。 - vgcore は、通常の core と同様、 gdb に読み込ませて解析に使用出来る。 //------------------------------------------------------------------------------- *** 特徴 [#valgrind-feature] - スレッドセーフである - プロセス全体の起動から終了までを調べることしか出来ないため、部分的な検査は面倒になる。 //------------------------------------------------------------------------------- *** valgrind で検出できないもの [#valgrind-undetect-errors] - valgrind はスタック上に確保されたメモリ、data/bas 領域のメモリの不正なアクセスは検出しない → [[4.6. Why doesn't Memcheck find the array overruns in this program?>http://valgrind.org/docs/manual/faq.html#faq.overruns]] -- これを検出するには、Mudflap を使う必要がある。 //=============================================================================== ** mtrace [#mtrace] //------------------------------------------------------------------------------- *** 使い方 [#mtrace-usage] + ヘッダをインクルードする #include <mcheck.h> + リークのテストを開始したい場所で ''mtrace()'' をコール + 終了したい場所で ''muntrace()'' をコールする + ''-g'' つきでコンパイル + 環境変数 ''MALLOC_TRACE'' を export する # export MALLOC_TRACE=<log-file-name> + プログラムを実行する - ${MALLOC_TRACE} に出力されたログの例 = Start @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049a98 0x1 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049aa8 0x1 @ /usr/lib/libstdc++.so.5:(_ZdlPv+0x23)[0x400b0de3] - 0x8049aa8 @ /usr/lib/libstdc++.so.5:(_Znwj+0x2e)[0x400b22fe] + 0x8049ab8 0x64 = End ~ ここで、 + は new - は delete + 以下の環境変数を指定することでメモリ領域の破壊などについてはデバッグしやすくなるかもしれません。 export MALLOC_CHECK_=”値” 値は0〜3です。 MALLOC_CHECK_ = 0 何もしない MALLOC_CHECK_ = 1 標準エラー出力に診断メッセージ表示 MALLOC_CHECK_ = 2 abort MALLOC_CHECK_ = 3 1と2の両方 //------------------------------------------------------------------------------- *** 特徴 [#mtrace-feature] - スレッドセーフではない - ソース内でどこからどこの間でリークを調べたいかを指定できる //=============================================================================== ** 参考リンク [#links] - [[メモリーリークの検出:mtrace , valgrind>http://blogs.itmedia.co.jp/komata/2009/10/mtrace-valgrind.html]] - [[メモリーリーク調査方法>http://www.nianyan.net/library/memory.html]]
テキスト整形のルールを表示する