Submit Search
Upload
逆戻りデバッグ補助のための嵌入的スパイの試作
•
0 likes
•
449 views
Kamiya Toshihiro
Follow
神谷年洋, 逆戻りデバッグ補助のための嵌入的スパイの試作 電子情報通信学会 SIGSS 2016年7月研究会 於 札幌
Read less
Read more
Software
Report
Share
Report
Share
1 of 25
Download now
Download to read offline
Recommended
そんなリザルトキャッシュで大丈夫か? #jjug
そんなリザルトキャッシュで大丈夫か? #jjug
Toshiaki Maki
HTMLの要素の選び方
HTMLの要素の選び方
TENTO_slide
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
Tsuyoshi Yamamoto
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
Kamiya Toshihiro
PBLへのアジャイル開発手法導入の試み
PBLへのアジャイル開発手法導入の試み
Kamiya Toshihiro
Introducing Parameter Sensitivity to Dynamic Code-Clone Analysis Methods
Introducing Parameter Sensitivity to Dynamic Code-Clone Analysis Methods
Kamiya Toshihiro
Kof2016 postgresql-9.6
Kof2016 postgresql-9.6
Toshi Harada
introduce "Stealing Machine Learning Models via Prediction APIs"
introduce "Stealing Machine Learning Models via Prediction APIs"
Isao Takaesu
Recommended
そんなリザルトキャッシュで大丈夫か? #jjug
そんなリザルトキャッシュで大丈夫か? #jjug
Toshiaki Maki
HTMLの要素の選び方
HTMLの要素の選び方
TENTO_slide
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
Tsuyoshi Yamamoto
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
Kamiya Toshihiro
PBLへのアジャイル開発手法導入の試み
PBLへのアジャイル開発手法導入の試み
Kamiya Toshihiro
Introducing Parameter Sensitivity to Dynamic Code-Clone Analysis Methods
Introducing Parameter Sensitivity to Dynamic Code-Clone Analysis Methods
Kamiya Toshihiro
Kof2016 postgresql-9.6
Kof2016 postgresql-9.6
Toshi Harada
introduce "Stealing Machine Learning Models via Prediction APIs"
introduce "Stealing Machine Learning Models via Prediction APIs"
Isao Takaesu
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
kyoto university
ゼロから始めたE2Eテスト
ゼロから始めたE2Eテスト
ushiboy
React Native GUIDE
React Native GUIDE
dcubeio
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
Toshio Ehara
Sencha ug3 siesta_share
Sencha ug3 siesta_share
久司 中村
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
TanUkkii
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
Insight Technology, Inc.
Continuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
Siphone coffeemaker okayama-js-1
Siphone coffeemaker okayama-js-1
NISHIMOTO Keisuke
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
なおき きしだ
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
Takakiyo Tanaka
CQRS+ESをAkka Persistenceを使って実装してみる。
CQRS+ESをAkka Persistenceを使って実装してみる。
Matsushita Satoshi
第12回 配信講義 計算科学技術特論B(2022)
第12回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
健一 茂木
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
YujiSoftware
MoteMote Compiler Plugin
MoteMote Compiler Plugin
yoshiaki iwanaga
Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版
Daiyu Hatakeyama
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
土岐 孝平
マーブル図で怖くないRxJS
マーブル図で怖くないRxJS
bitbank, Inc. Tokyo, Japan
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)
fumoto kazuhiro
ソースコード推薦あるいは修正の情報源としての質問掲示板とソースコードレポジトリの比較
ソースコード推薦あるいは修正の情報源としての質問掲示板とソースコードレポジトリの比較
Kamiya Toshihiro
Code Difference Visualization by a Call Tree
Code Difference Visualization by a Call Tree
Kamiya Toshihiro
More Related Content
Similar to 逆戻りデバッグ補助のための嵌入的スパイの試作
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
kyoto university
ゼロから始めたE2Eテスト
ゼロから始めたE2Eテスト
ushiboy
React Native GUIDE
React Native GUIDE
dcubeio
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
Toshio Ehara
Sencha ug3 siesta_share
Sencha ug3 siesta_share
久司 中村
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
TanUkkii
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
Insight Technology, Inc.
Continuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
Siphone coffeemaker okayama-js-1
Siphone coffeemaker okayama-js-1
NISHIMOTO Keisuke
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
なおき きしだ
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
Takakiyo Tanaka
CQRS+ESをAkka Persistenceを使って実装してみる。
CQRS+ESをAkka Persistenceを使って実装してみる。
Matsushita Satoshi
第12回 配信講義 計算科学技術特論B(2022)
第12回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
健一 茂木
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
YujiSoftware
MoteMote Compiler Plugin
MoteMote Compiler Plugin
yoshiaki iwanaga
Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版
Daiyu Hatakeyama
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
土岐 孝平
マーブル図で怖くないRxJS
マーブル図で怖くないRxJS
bitbank, Inc. Tokyo, Japan
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)
fumoto kazuhiro
Similar to 逆戻りデバッグ補助のための嵌入的スパイの試作
(20)
第3回 JavaScriptから始めるプログラミング2016
第3回 JavaScriptから始めるプログラミング2016
ゼロから始めたE2Eテスト
ゼロから始めたE2Eテスト
React Native GUIDE
React Native GUIDE
Java初心者勉強会(2015/08/07)資料
Java初心者勉強会(2015/08/07)資料
Sencha ug3 siesta_share
Sencha ug3 siesta_share
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
[db tech showcase Tokyo 2017] D15: ビッグデータ x 機械学習の高速分析をVerticaで実現!by ヒューレット・パッ...
Continuation with Boost.Context
Continuation with Boost.Context
Siphone coffeemaker okayama-js-1
Siphone coffeemaker okayama-js-1
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
CQRS+ESをAkka Persistenceを使って実装してみる。
CQRS+ESをAkka Persistenceを使って実装してみる。
第12回 配信講義 計算科学技術特論B(2022)
第12回 配信講義 計算科学技術特論B(2022)
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
シンプルな9つのサンプルで学ぶJava Script初心者のためのAngularJS超入門ハンズオン
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
MoteMote Compiler Plugin
MoteMote Compiler Plugin
Azure Machine Learning Services 概要 - 2019年2月版
Azure Machine Learning Services 概要 - 2019年2月版
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
マーブル図で怖くないRxJS
マーブル図で怖くないRxJS
究極のバッチフレームワーク(予定)
究極のバッチフレームワーク(予定)
More from Kamiya Toshihiro
ソースコード推薦あるいは修正の情報源としての質問掲示板とソースコードレポジトリの比較
ソースコード推薦あるいは修正の情報源としての質問掲示板とソースコードレポジトリの比較
Kamiya Toshihiro
Code Difference Visualization by a Call Tree
Code Difference Visualization by a Call Tree
Kamiya Toshihiro
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
Kamiya Toshihiro
任意粒度機能モデルコードクローン検出手法のリファクタリング理解への適用の試み
任意粒度機能モデルコードクローン検出手法のリファクタリング理解への適用の試み
Kamiya Toshihiro
An Execution-Semantic and Content-and-Context-Based Code-Clone Detection and ...
An Execution-Semantic and Content-and-Context-Based Code-Clone Detection and ...
Kamiya Toshihiro
任意粒度機能モデルに基づく動的型付けプログラミング言語向けソースコード検索手法の提案
任意粒度機能モデルに基づく動的型付けプログラミング言語向けソースコード検索手法の提案
Kamiya Toshihiro
Web アプリケーションの UI 機能テストの ための HTML 構造パターンの抽出手法
Web アプリケーションの UI 機能テストの ための HTML 構造パターンの抽出手法
Kamiya Toshihiro
WebアプリケーションのUI機能テストのためのHTML構造パターンの提案
WebアプリケーションのUI機能テストのためのHTML構造パターンの提案
Kamiya Toshihiro
An Algorithm for Keyword Search on an Execution Path
An Algorithm for Keyword Search on an Execution Path
Kamiya Toshihiro
And/Or/Callグラフの提案とソースコード検索への応用
And/Or/Callグラフの提案とソースコード検索への応用
Kamiya Toshihiro
任意粒度機能モデルに基づくコードクローン検出手法の大規模プログラムの適用に向けた改善
任意粒度機能モデルに基づくコードクローン検出手法の大規模プログラムの適用に向けた改善
Kamiya Toshihiro
任意粒度機能モデルに基づくバイトコードからのコードクローン検出手法
任意粒度機能モデルに基づくバイトコードからのコードクローン検出手法
Kamiya Toshihiro
More from Kamiya Toshihiro
(12)
ソースコード推薦あるいは修正の情報源としての質問掲示板とソースコードレポジトリの比較
ソースコード推薦あるいは修正の情報源としての質問掲示板とソースコードレポジトリの比較
Code Difference Visualization by a Call Tree
Code Difference Visualization by a Call Tree
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
任意粒度機能モデルコードクローン検出手法のリファクタリング理解への適用の試み
任意粒度機能モデルコードクローン検出手法のリファクタリング理解への適用の試み
An Execution-Semantic and Content-and-Context-Based Code-Clone Detection and ...
An Execution-Semantic and Content-and-Context-Based Code-Clone Detection and ...
任意粒度機能モデルに基づく動的型付けプログラミング言語向けソースコード検索手法の提案
任意粒度機能モデルに基づく動的型付けプログラミング言語向けソースコード検索手法の提案
Web アプリケーションの UI 機能テストの ための HTML 構造パターンの抽出手法
Web アプリケーションの UI 機能テストの ための HTML 構造パターンの抽出手法
WebアプリケーションのUI機能テストのためのHTML構造パターンの提案
WebアプリケーションのUI機能テストのためのHTML構造パターンの提案
An Algorithm for Keyword Search on an Execution Path
An Algorithm for Keyword Search on an Execution Path
And/Or/Callグラフの提案とソースコード検索への応用
And/Or/Callグラフの提案とソースコード検索への応用
任意粒度機能モデルに基づくコードクローン検出手法の大規模プログラムの適用に向けた改善
任意粒度機能モデルに基づくコードクローン検出手法の大規模プログラムの適用に向けた改善
任意粒度機能モデルに基づくバイトコードからのコードクローン検出手法
任意粒度機能モデルに基づくバイトコードからのコードクローン検出手法
逆戻りデバッグ補助のための嵌入的スパイの試作
1.
逆戻りデバッグ補助のための 嵌入的スパイの試作 神谷 年洋 島根大学大学院総合理工学研究科 かんにゅう IEICE SIGSS
2016年7月研究会 於 札幌 神谷年洋, 逆戻りデバッグ補助のための嵌入的スパイの試作, 信学技報, vol. 116, no. 127, pp. 87-92, (2016-07-14)
2.
逆戻りデバッグとは? ● 逆戻りデバッグ、backward-in-time debugging, omniscient debugging[13] ● 逆向きにステップ実行ができるデバッガ(によるデバッグ) �
ステップ実行で行き過ぎる(原因であると思われる箇所を通り すぎる) → 戻る � 出力の文から逆向きにステップ実行していく ● 実装: 実行途中の状態をすべて保存する or 状態を復元できる実行トレースを保存する [13] B. Lewis, M. Ducasse, Using Events to Debug Java Programs Backwards in Time, OOPSLA’03
3.
クラッシュしないバグとは? クラッシュするバグ クラッシュしないバグ 現象 プログラムの実行が中 断する プログラムの実行は終了す るが振る舞いが予想外 デバッグの 起点 実行が中断した場所が デバッグの起点になる プログラムのどの部分がそ の振る舞いに相当するのか を調べるところから 原因
初期化し忘れなどの軽 微なエラーも含まれる ロジックの誤り ⇒ クラッシュしないバグのほうが修正が難しい
4.
クラッシュしないバグの デバッグ作業とは? (1) 選択したプログラム(の一部分)を対象 として、 (2)
プログラムの実行を通して、さまざまな 入力が与えられ出力が得られるのを観察し、 (3) それらの入出力が正しいか(期待した振る 舞いか)を判定する (4) 上の(1)〜(3)を、対象を変化させつつ繰り 返し、不具合の原因を特定する 不具合の原因: 期待通りの入力に対して、期待した 出力をしない小さなプログラムの部分 クラッシュしないバグの特定 ≒ プログラム理解 完全には理解できていない、 文書化されていない 期待した振る舞い=仕様 仕様の復元、確認
5.
スパイとは? ● ユニットテストにおいて、オブジェクト 間でやり取りされるメッセージを捉える 機能 – Java向けのライブラリMockitoは、 スパイ、モック、スタブといった機 能を提供している ● スパイを用いたテスト: プログラムの実行中に実際に呼び出さ れたメソッドのそれぞれについて、 その順序や引数の値が期待されるもの と同じか確認する – 実測値(actual)
vs 期待値(expected) 「ケース」に対するメソッド呼び出し(実測値): (1) ProductName()→ [“Oval”, “Duvel”] (2) qty(“Oval”) → 4 ユーザ 在庫管理 ケース 在庫確認 productNames() ["Oval", "Duvel"] qty("Oval") 4 在庫表示 「ケース」に対するメソッド呼び出し(期待値):
6.
実行トレースの記録 ● 実行トレースとは – 対象プログラムを実行し ● インストラクション(呼びだされた手続きや計算された式) ● 引数や戻り値(評価値)など を時間順に記録したもの – 手続き呼び出しについては、入る(呼び出しにより)と出る(リ ターンや例外送出など)の2つのイベントを記録
→ コールツリー ● 値の記録方法 – アトミックな値(intやboolなど)については、その値の表現(123 やTrue)を記録 – オブジェクト(内部構造; フィールドを持つ)については、IDを記録 ● フィールドの値が必要なときは、そのオブジェクトのフィールド への参照や代入といったインストラクションを遡ることで再現 実行トレースの記録の方法のバリエーションとしては、オブジェクトの内部 のデータまで含めて記録、分岐ごとに1ビットでどちらをたどるか記録、等 :54568 1.1 load_const None :54569 1.1 line file=cal.py line=2 :54570 1.1 load_const -1 :54571 1.1 load_const <tuple #5606> :88854 1.1 line file=cal.py line=4 :88855 1.1 load_const <string #8171> text='Su Mo T Sa' :88856 1.1 line file=cal.py line=6 :88857 1.1 load_const <code #8172> name=print_c file=cal.py line=6 :88858 1.1 line file=cal.py line=17 :88859 1.1 load_const <code #8173> name=main fi line=17 :88860 1.1 line file=cal.py line=22 :88861 1.1 load_const <string #2832> text='__main :88862 1.1 result True :88863 1.1 line file=cal.py line=23 :88864 1.1 call <code #8173> name=main file=cal.p :88865 1.1 line file=cal.py line=18 :88866 1.1 load_global_from <string #91> text='int' :88867 1.1 result <type #92> name=int :88868 1.1 load_global_from <string #2055> text='s :88869 1.1 result <module #5> :88870 1.1 call $LOAD_ATTR$ :88871 1.1 self.0 <module #5> :88872 1.1 arg.1 <string #8174> text='argv' :88873 1.1 return <list #8175> :88874 1.1 load_const 1 :88875 1.1 call $BINARY_SUBSCR$ :88876 1.1 self.0 <list #8175> :88877 1.1 arg.1 1 :88878 1.1 return <string #8176> text='2016' :88879 1.1 line file=cal.py line=19 :88880 1.1 load_global_from <string #91> text='int' :88881 1.1 result <type #92> name=int :88882 1.1 load_global_from <string #2055> text='s :88883 1.1 result <module #5> :88884 1.1 call $LOAD_ATTR$ :88885 1.1 self.0 <module #5> :88886 1.1 arg.1 <string #8174> text='argv'
7.
実行トレースの記録 ● 実行トレースとは – 対象プログラムを実行し ● インストラクション(呼びだされた手続きや計算された式) ● 引数や戻り値(評価値)など を時間順に記録したもの – 手続き呼び出しについては、入る(呼び出しにより)と出る(リ ターンや例外送出など)の2つのイベントを記録
→ コールツリー ● 値の記録方法 – アトミックな値(intやboolなど)については、その値の表現(123 やTrue)を記録 – オブジェクト(内部構造; フィールドを持つ)については、IDを記録 ● フィールドの値が必要なときは、そのオブジェクトのフィールド への参照や代入といったインストラクションを遡ることで再現 実行トレースの記録の方法のバリエーションとしては、オブジェクトの内部 のデータまで含めて記録、分岐ごとに1ビットでどちらをたどるか記録、等 :54568 1.1 load_const None :54569 1.1 line file=cal.py line=2 :54570 1.1 load_const -1 :54571 1.1 load_const <tuple #5606> :88854 1.1 line file=cal.py line=4 :88855 1.1 load_const <string #8171> text='Su Mo T Sa' :88856 1.1 line file=cal.py line=6 :88857 1.1 load_const <code #8172> name=print_c file=cal.py line=6 :88858 1.1 line file=cal.py line=17 :88859 1.1 load_const <code #8173> name=main fi line=17 :88860 1.1 line file=cal.py line=22 :88861 1.1 load_const <string #2832> text='__main :88862 1.1 result True :88863 1.1 line file=cal.py line=23 :88864 1.1 call <code #8173> name=main file=cal.p :88865 1.1 line file=cal.py line=18 :88866 1.1 load_global_from <string #91> text='int' :88867 1.1 result <type #92> name=int :88868 1.1 load_global_from <string #2055> text='s :88869 1.1 result <module #5> :88870 1.1 call $LOAD_ATTR$ :88871 1.1 self.0 <module #5> :88872 1.1 arg.1 <string #8174> text='argv' :88873 1.1 return <list #8175> :88874 1.1 load_const 1 :88875 1.1 call $BINARY_SUBSCR$ :88876 1.1 self.0 <list #8175> :88877 1.1 arg.1 1 :88878 1.1 return <string #8176> text='2016' :88879 1.1 line file=cal.py line=19 :88880 1.1 load_global_from <string #91> text='int' :88881 1.1 result <type #92> name=int :88882 1.1 load_global_from <string #2055> text='s :88883 1.1 result <module #5> :88884 1.1 call $LOAD_ATTR$ :88885 1.1 self.0 <module #5> :88886 1.1 arg.1 <string #8174> text='argv' :88870 1.1 call $LOAD_ATTR$ :88871 1.1 self.0 <module #5> :88872 1.1 arg.1 <string #8174> text='arg :88873 1.1 return <list #8175>
8.
● 逆戻りデバッグ(デバッガ) ● クラッシュしないバグ ● クラッシュしないバグのデバッグ作業 – プログラム理解 ● スパイ ● 嵌入的スパイ ● 嵌入的スパイによるデバッグ作業
9.
逆戻りデバッグ補助のための嵌入的スパイ アイデア: プログラム理解のための機能を強化し たデバッガ ● デバッグ中に動作を理解したいコード断片に ついて ● それをひとつの部品(オブジェクト)と捉え たときの入出力を観察したい ● プログラム実行(振る舞い)の全体(文脈) を意識しながら ● 対話的に利用したい かんにゅう [スパイ] 必ずしも手続き単位ではない。 手続きの一部や、複数の手続きに またがることも [嵌入的; intrusive] 逆戻りデバッグ 実行トレースの記録があるので、 対話的なUIで(対象プログラムを再度実行 することなく)スパイを構成できる
10.
デバッグ作業のモデル ● 前提: 再現するバグ – 対象のプログラムに特定の入力を与えると 誤った出力(予想外の振る舞い)が得られ る
11.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 通常のデバッガによるステップ実行 ● インストラクションをひとつ実行するたびに (一時)停止して、 ● 引数や戻り値を確認する m
12.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 通常のデバッガによるステップ実行 ● インストラクションをひとつ実行するたびに (一時)停止して、 ● 引数や戻り値を確認する n
13.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 通常のデバッガによるステップ実行 ● インストラクションをひとつ実行するたびに (一時)停止して、 ● 引数や戻り値を確認する o
14.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 通常のデバッガによるステップ実行 ● インストラクションをひとつ実行するたびに (一時)停止して、 ● 引数や戻り値を確認する q
15.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 通常のデバッガによるステップ実行 ● インストラクションをひとつ実行するたびに (一時)停止して、 ● 引数や戻り値を確認する r …
通り過ぎてしまった
16.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 逆戻り+トレース表示ありデバッガによるデ バッグ ● 各インストラクションの実行を、任意の順番で 調べていく m n o p q r
17.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 嵌入的スパイによるデバッグ ● (実行トレース上で連続したインストラクションに相当する) コード断片を指定し –
図のS, T, U その入出力値を観察する – 図のa, b, c, d, e ● 入出力値の観察を通して – コードの仕様を理解する – 値が予想通りか確認することで範囲を絞っていく m q r a d e S
18.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 嵌入的スパイによるデバッグ ● (実行トレース上で連続したインストラクションに相当する) コード断片を指定し –
図のS, T, U その入出力値を観察する – 図のa, b, c, d, e ● 入出力値の観察を通して – コードの仕様を理解する – 値が予想通りか確認することで範囲を絞っていく m n q r a b d e S T
19.
デバッグ作業のモデル ● 前提: 再現するバグ ▷ 嵌入的スパイによるデバッグ ● (実行トレース上で連続したインストラクションに相当する) コード断片を指定し –
図のS, T, U その入出力値を観察する – 図のa, b, c, d, e ● 入出力値の観察を通して – コードの仕様を理解する – 値が予想通りか確認することで範囲を絞っていく m n o p q r a b c d e S T U
20.
「コード断片」 実行トレース内のサブシーケンス(連続したインストラクション) を「コード断片」とみなす ● 「コード断片」の入出力値を考えることができる → プログラム 理解 –
「入力値」: サブシーケンスの外で定義されサブシーケンス内 で利用される値 – 「出力値」: サブシーケンスの内で定義されサブシーケンス外 で利用される ● 実行トレース⇔ソースコードの対応を利用することで – 対応するソースコードの断片がループの中にあるとき → 繰り 返しの各実行について、「コード断片」入出力値を比較できる ● 比較可能な「コード断片」を探しだして入出力値を比較(未実 装) l ll l
21.
嵌入的スパイツールの機能 ブラウズ: 実行トレースをツリーとして表示/折りたたみ ソースコード参照: 実行トレースと対応するソースコードを並べて表示 検索:
実行トレース内で値、メソッド名、オブジェクトIDにより検索 キャプチャーポイント: – 実行トレース内の指定した位置のメソッド呼び出し等の引数や戻 り値の値を表示 – ソースコード内の位置から指定して値を表示/比較 実際には、ソースコードの行毎に実行トレースを折りたたみ → 折りたたんだ位置の上でキャプチャーポイントを指定 → 該当するすべての位置にキャプチャーポイントが設定される
22.
実装 嵌入的スパイツールは、実行トレース取得ツールと実行トレースビューアからなる ● 実行トレース取得ツール – Python 2.7.11インタープリタ(C言語)に860行の追加・修正 –
インタプリタに手を入れることで ● 大域変数への代入や参照を記録 ● 実行トレース全体で一意なオブジェクトIDを生成 ● 実行トレースビューア – 実行トレースの表示や折りたたみ、 キャプチャーポイント、検索 – lessコマンドに似せたUI – 2375行のPythonコードにより実装 デバッガの デバッグって 難しぃ�
23.
例題/デモ?
24.
まとめと展望 ● バグ位置の特定 ≒ プログラム理解 ● 逆戻りデバッグのための嵌入的スパイを提案した –
プログラム理解のための機能を強化したデバッガ – 入出力からコード断片(サブシーケンス)の機能を調べる ● 簡単な実装をおこなった 展望 ● 大規模な実行トレースに対応できるように – データ構造とアルゴリズムの設計 ● 視覚的なフィードバックの強化 ● 比較可能なサブシーケンスを発見する機能
25.
Thanks to フォント: ● アームド・バナナ http://calligra-tei.oops.jp/ex-banana.html ● りいてがき筆
http://www.kcc.zaq.ne.jp/in-mlg/freefont/riitf/ イラスト: ● いらすとや http://www.irasutoya.com/
Download now