Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
gdb+Pythonの自作テストハーネスに関数コールの機能を入れた話
Search
ken551
December 09, 2023
0
26
gdb+Pythonの自作テストハーネスに関数コールの機能を入れた話
at 2023/12/9 合同勉強会 in 大都会岡山 2023 Winter
ken551
December 09, 2023
Tweet
Share
More Decks by ken551
See All by ken551
簡易ラズピコオシロを改造して簡易フリスクオシロを作った話
ken551
0
150
RL78向けテストハーネスをGDBスクリプトで作ろうとした話
ken551
0
58
Featured
See All Featured
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
Gamification - CAS2011
davidbonilla
77
4.6k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
Designing with Data
zakiwarfel
96
4.8k
A Tale of Four Properties
chriscoyier
153
22k
Designing for Performance
lara
601
67k
Design by the Numbers
sachag
274
18k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
245
20k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
14
8.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
13
4.7k
Documentation Writing (for coders)
carmenintech
60
4k
Transcript
gdb+Pythonの自作テストハーネスに 関数コールの機能を入れた話 2023/12/9 @ 合同勉強会 in 大都会岡山 2023 Winter 祐源
英俊 1
自己紹介 祐源 英俊(ゆうげん ひでとし) • 1995年生まれ(28歳) • 学生時代は組込みシステムを中心に勉強 • 電子部品事業部で組込みソフト開発
(組込みエンジニアとしては3年目) • 趣味:車、音楽、電子工作 X: @Ke_N_551 Github: ken551 2
この発表は? 組込み開発でも高頻度な 自動テストがしたい! ・・・ので、テストハーネスを自作しているという話です 3
こんなものを作ってます 4
こんなものを作ってます テスト対象 コード テスト スクリプト テスト 実施結果 5
テスト失敗の場合→NG結果を報告 ビルド・テスト実施 6
本LTの範囲 関数コール テストケース(Pythonで記述) 7
関数コールについて 8
RL78の関数コールについて • 関数呼び出し時は以下の処理を呼び出し側が行う • スタックにスタックフレームを作成する • リターンアドレスの保存 • 受け渡す引数を確保 •
汎用レジスタに受け渡す引数を格納する ※レジスタ値の退避も呼び出し側の責任 • 関数からのリターン時は以下の処理を呼び出され側が行う • 戻り値の汎用レジスタへの格納 9
RL78 関数コール時の引数受け渡し • 基本的には汎用レジスタで引数を受け渡す • 所定の優先度に従って格納する • 入りきらない場合→スタックに格納する A X
C B … (uint8_t a, uint8_t b) a b A X C B … (uint8_t a, uint16_t b) a b (LSB) b(MSB) 引数 レジスタ 引数 レジスタ 10
関数コールの実装① ①関数の引数型に応じ、汎用レジスタへ値を格納 11
関数コールの実装② ②スタックフレームの作成 (=returnアドレスとしてmain関数のアドレスを格納) 12
関数コールの実装③ ③関数コールの実施 (=プログラムカウンタにコールする関数のアドレスをセット) 事前に設置したmain関数のブレークポイント到達まで、 呼び出した関数が実行される 13
関数コールの実装④ ④return後(=main関数にブレーク後)に、 汎用レジスタから返値を取り出す 14
発表まとめと今後 • GDBとPythonを使って作る自作テストハーネスで、 関数コールの機能が実現できた • 汎用レジスタへの引数セットとフレーム作成で 関数呼び出しを疑似的に実施 • ある程度実用的に使えるが、課題は多くできることはまだ少な い
• 対応する引数/返値の型が少ない • よくわからない動作をする(これは致命的) →ゆっくり課題をつぶしていきたい 15
参考 • 『テスト駆動開発による組み込みプログラミング』 James W. Grenning 著、オライリージャパン • GDBデバッガ マニュアル
英語版: https://ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_toc.html 日本語版: https://flex.phys.tohoku.ac.jp/texi/gdb-j/gdb-j_toc.html • Renesas CC-RLコンパイラ ユーザーズマニュアル 9. 関数呼び出し仕様 https://tool-support.renesas.com/autoupdate/support/onlinehelp/ja- JP/csp/V8.07.00/CS+.chm/Compiler-CCRL.chm/Output/ccrl09c0000y.html • Renesas RL78/G14 ユーザー図マニュアル ハードウェア編 ( R01UH0186JJ0350 Rev. 3.50) 16
あぺ 17
苦労した点 • 引数・返値が全く扱えない!! • gdbのcall機能だと関数の実行がまともに扱えない • 引数が渡せない(引数に応じた振る舞いの変化がない) • 返値が返ってこない(意味不明な値が結果として返る) •
スタック領域が全く変化しない(関数呼び出しでスタック積むのでは?) • そもそも裏で何やってんの? 引数・返値なしの関数しか使えないのはさすがに困る
苦労した点 • おそらく、call実施時にgdbがダミーフレームを使うのでは? • なんかそれっぽい解説あり(確信はなし) ax bc … pc 実際のフレーム
実際のフレーム ダミーフレーム Call実施 実際のフレーム (変更なし) ダミーフレーム (削除) Call終了 コピー こっちをさわる