Doc.10 エミュレータのデバッグコンソール †エミュレータにはとても嬉しいことにデバッグ用のコンソールがついています(Tools->Logging)。 ![]() VBA方式とMappy方式の2種類あり、
VBA方式はswi命令を呼び出し、エミュレータの独自処理にフックさせています。 対するMappy方式はldr、andなどの無意味なシグネチャ処理によって実現しています。 発展方法 †sprintf関数と併用すれば、文字列の中に16進数表記なども扱えるようになります。 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> void mappylog(char* buf) { asm("mov r2, %0; ldr r0,=0xc0ded00d; and r0,r0" :: "r"(buf) : "r2", "r0"); } int debug(char *fmt, ...) { char s[80]; va_list marker; va_start(marker, fmt); int r = vsprintf(s, fmt, marker); va_end(marker); mappylog(s); return r; } 意図しない長さの文字列を扱う場合、スタック変数のs[80]が壊れる場合もありえます。 履歴 †
|