\documentclass[a4j,12pt]{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage{lscape}

\setlength{\textheight}{\paperheight}   % ���ʏc����{���̈�ɂ���iBOTTOM=-TOP�j
\setlength{\topmargin}{4.6truemm}       % ��̗]����30mm�i=1inch+4.6mm�j��
\addtolength{\topmargin}{-\headheight}  % 
\addtolength{\topmargin}{-\headsep}     % �w�b�_�̕������{���̈���ړ�������
\addtolength{\textheight}{-60truemm}    % ���̗]����30mm�iBOTTOM=-TOP������+TOP+30mm�j

\setlength{\textwidth}{\paperwidth}     % ���ʉ�����{���̈�ɂ���iRIGHT=-LEFT�j
\setlength{\oddsidemargin}{-0.4truemm}  % ���̗]����25mm(=1inch-0.4mm)��
\setlength{\evensidemargin}{-0.4truemm} % 
\addtolength{\textwidth}{-50truemm}     % �E�̗]����25mm�iRIGHT=-LEFT�j

\def\null{}
\def\csp{C\raise.5mm\hbox{\small \#}}
\def\cpp{C\raise.5mm\hbox{\scriptsize +\kern -.2em+}}
\def\figurenamestring{Fig }

\def\medskip{\vspace{1.5mm}}
\def\figurename{\figurenamestring}

\begin{document}
%
\begin{center}
  \large{\bf {\tt SprCSharp}�ɂ������O�̎�舵��}
\end{center}

%  ��O��舵���̕��j
%
\medskip
\noindent
\cpp �ō쐬���ꂽSpringhead library��\csp ������Ăяo���ꍇ�A
library���Ŕ��������O�̏���\csp ���Ŏ擾����ɂ͎��̂悤�ȍ������B
\begin{enumerate}
  \def\labelenumi{(\arabic{enumi})}
  \item	library���Ŕ�������``access violation'', ``array bounds exceeded''�Ȃǂ�
	��O��Windows�ł�Structured Exception�Ƃ��Ĉ����A
	�ʏ��\cpp �ɂ�����try�`catch�̎d�g�݂ł͑����邱�Ƃ��ł��Ȃ��B
  \item	\cpp �̃R�[�h��unmanaged space��Ŏ��s����邽�߁A
	library���Ŕ���������O�������I��unmanaged--managed���E�𒴂���
	�`�������邱�Ƃ��ł��Ȃ��B
\end{enumerate}

\noindent
���̂��߁A���ɂ悤�Ȏ�舵������������B

\begin{description}
  \item	[Structured Exception�̈���]~
	\begin{enumerate}
	\def\labelenumi{\alph{enumi})}
	  \item	Structured Exception�́A�v���O�������s����
		{\tt \,\_se\_translator\_function}�^�̃n���h��SEHandler
		({\tt se\_translator()})��o�^���邱�Ƃő����邱�Ƃ��ł���
		(���̃R�[�h��/EHa�I�v�V�����t���Ńr���h����K�v������)�B
	  \item	SEHandler�̒���{\tt std::exception}���p��������O�N���XSEH\_Exception
		�̃C���X�^���X�𐶐�����throw���邱�Ƃɂ��A
		�ʏ��try�`catch�R�[�h�ŕߑ��ł����O�ɂ����ւ��邱�Ƃ��ł���B
	  \item	SEHandler�́A��O�𔭐�����try�߂ɑΉ�����catch�߂����O�ɌĂяo�����
		����Springhead library�̒��ł���𑨂��邱�Ƃ��\�ł��邪�A
		library�̃R�[�h���̂ɕύX�������邱�Ƃ͖]�܂����Ȃ����߁A
		�����ł�catch�����A������Ăяo���A�_�v�^���\�b�h(SprExport.dll)�̒���
		��������̂Ƃ���B
	  \item	�A�_�v�^���\�b�h�ɂ����ė�O��⑫�������ɂ́A
		��O���N������library�֐�����A�_�v�^���\�b�h�܂ł�call stack��
		���Ɋ����߂���Ă��܂��Ă��邽�߁A
		�K�v��trace back���𓾂邱�Ƃ��ł��Ȃ��B
		���̂���SEHandler���Ăяo���ꂽ���_
		(SEHandler�͗�O������������ŏ��ɌĂяo����邽�߁A
		��O�������_�ł�call stack���܂��c����Ă���)��trace back����
		�擾���Ă����A
		��ł��̏������o���d�g�݂���邱�ƂƂ���B
		SEHandler�͕�����Ăяo�����\��������̂ŁA
		2��ڈȍ~�͉������Ȃ��悤�ɂ���B
	\end{enumerate}
	\vspace{2mm}
  \item	[unmanaged--managed���E�𒴂��Ă̗�O�`��]~
	\begin{enumerate}
	\def\labelenumi{\alph{enumi})}
	  \item	\csp ����{\tt SEHException}���p��������O�N���XSEH\_Exception��
		�p�ӂ��A``���̃N���X�̗�O��throw���郁�\�b�h{\tt RaiseException()}��
		�Ăяo��\cpp �֐�{\tt raise\_managed\_exception()}''��SprExport.dll��
		(unmanaged space)�ɓo�^����d�g�݂�p�ӂ���B
	  \item	Springhead library���ŗ�O��������SprExport.dll���ł����catch����
		�Ȃ�΁A�o�^����Ă���{\tt raise\_managed\_exception()}���Ăяo���B
	  \item	{\tt raise\_managed\_exception()}��\csp ��(managed space)�Ŏ��̂��Ƃ�
		���s����B
		\begin{enumerate}
		  \item	SEHandler(\cpp ��)���쐬����trace back�������o���B
		  \item	{\tt System.Exception}�̃C���X�^���X�𐶐�����throw����B
			(a)�Ŏ��o����trace back�����O���Ƃ���B
		\end{enumerate}
	\end{enumerate}
\end{description}

\medskip
\noindent
�ȏ�̎��������t��\figurenamestring\ref{fig_exception_flow}�ɐ}�����A
���̌�ɐ�����������B

�֘A����\�[�X�t�@�C���́A\\
\begin{tabular}{@{\hspace{10mm}}l}
  {\tt SprCSharp/CSUtility.cs}	\\
  {\tt SprImport/CSUtility.cs}	\\
  {\tt SprExport/CSUtility.h}	\\
  {\tt SprExport/CSutility.cpp}
\end{tabular}\\
�ł���B

%  ��O�t���[�̐}
%	BoundingBox: 0 250 850 850
%
\begin{landscape}
\begin{figure}[t]
\begin{center}
\includegraphics[height=1.0\textwidth]{ExceptionFlow.eps}
\end{center}
\caption{��O�̓`��}
\label{fig_exception_flow}
\end{figure}
\end{landscape}

%  ��O�t���[�̐���
%
\noindent
�O�t�̐}�ɏ]���ď����y�ї�O�̗�����������B
���Ԃ͐}���̖���ԍ��ɑΉ�����B

\def\srcfile#1#2{\\
  \let\orgarraystretch\arraystretch
  \ifx#1\null\else\def\arraystretch{.8}\fi
  \begin{tabular}{@{\hspace{4mm}}l@{\hspace{3mm}}l}%
  \ifx#1\null\else\rule{0pt}{4mm}\hbox to 6mm{\csp}&{\tt #1}\\\fi
  \ifx#2\null\else\cpp&{\tt #2}\fi
  \end{tabular}
  \let\arraystretch\orgarraystretch
  \vspace{1mm}
}

\begin{description}
  \item	[�������̗���]~
	\begin{enumerate}
	\def\labelenumi{\roman{enumi})}
	  \item	unmanaged space (SprExport.dll)��SEHandler��o�^����B
		\srcfile{SEH\_Exception.init()}{Spr\_set\_se\_translator()}
	  \item	�N���XExceptionRaiser�̃C���X�^���X�𐶐�����B
		\srcfile{EXceptionRaiser.ExceptionRaiser()}{}
	  \item	�����unmanaged space�ɓo�^����B
		\srcfile{}{Spr\_register\_exception\_raiser()}
	\end{enumerate}
  \item	[����/��O�̗���]~
	\begin{enumerate}
	\def\labelenumi{\arabic{enumi})}
	  \item	���[�U�\�[�X����\csp ��(SprCSharp.dll)�Œ�`���ꂽ�N���X{\tt C}��
		���\�b�h���Ăяo���B
		\srcfile{C.Method()}{}
	  \item	{\tt C.Method()}(managed)����SprExport.dll(\cpp, unmanaged)��
		��`����Ă���Ή����\�b�h���Ăяo���B
		\srcfile{SprExport.Spr\_C\_Method()}{Spr\_C\_Method()}
	  \item	{\tt Spr\_C\_Method()}����Springhead library���̃��\�b�h���Ăяo�����B
		\srcfile{}{C::Method()}
	  \item	���̃��\�b�h�̒���Structured Exception����������B
	  \item	SEHandler���Ăяo�����B
		\srcfile{}{se\_translator()}
	  \item	������call stack��trace back���s�Ȃ��B
		\srcfile{}{SEH\_Exception::trace()}
	  \item	������ {\tt SEH\_Exception}�̃C���X�^���X�𐶐�����throw����B
		Springhead library�̒��ł͂��̗�O��catch�����A�ďo���K�w��k����
		SprExport.dll�̒���catch����B
		\srcfile{}{Spr\_C\_Method()}
	  \item	\csp ���ɗ�O��`�����邽�߂̃V�[�P���X���J�n����B
		\srcfile{}{SEH\_Exception::raise\_managed\_exception()}
	  \item	unmanaged����managed���Ăяo���āA\csp �̗�O�𔭐�������B
		\srcfile{ExceptionRaiser.RaiseException()}
			{SEH\_Exception::raise\_managed\_exception()}
	  \item	��������[�U�\�[�X��{\tt System.Exception}�Ƃ���catch����B
	  \item	catch������O�C���X�^���X�������Ƃ���stack trace�����擾����B
		������catch������O�C���X�^���X��\csp ����call stack�̏�񂵂�
		�����Ă��Ȃ��B
		\srcfile{SEH\_Exception.what()}{}
	  \item	unmanaged���Ŏ擾���Ă�����stack trace�������o���A
		�����œn���ꂽ\csp ����stack trace���ƃ}�[�W���邱�Ƃ�
		�Sstack trace�����쐬����B
		\srcfile{SEH\_Exception.what()}{SEH\_Exception::what()}
	\end{enumerate}
\end{description}

\noindent
�Ō�ɁAUnity����Springhead library���Ăяo���ꍇ�̒��ӓ_���L���B

\def\narrow[#1]{\list{}{\topsep 0pt \partopsep 0pt
    \parsep 0pt \itemsep 0pt \leftmargin #1 \relax}\item[]}
\let\endnarrow\endlist

\begin{itemize}
  \item	��O�`���@�\�̏�������1�񂾂��s�Ȃ��K�v������B
	\begin{narrow}[8mm]{\tt
	    using SprCS;\\
	    SEH\_Exception.init();
	}\end{narrow}
	{\tt PHSceneBehaviour.cs}��{\tt Build()}�̖`���ŏ��������Ă���B
  \item	��O��System.Exception�Ƃ��ĕ⑫����B
	stack trace�́A�⑫������O�C���X�^���X�������Ƃ��ăN���XSEH\_Exception��
	���\�b�hwhat()���Ăяo�����ƂŎ擾����B
	\begin{narrow}[8mm]{\tt
            catch (System.Exception e) \{
	    \begin{narrow}[8mm]
		Debug.Log(SEH\_Exception.what(e));
	    \end{narrow}
	    \}
	}\end{narrow}
  \item	Unity��console�^�u�ɂ�����``Error Pause''��on�ɂ��Ă����Ȃ��ƁA
	��O�����Ɠ�����Unity���I�����Ă��܂��̂Œ��ӂ��K�v�ł���B

\end{itemize}

\medskip
\noindent
{\bf �y�⑫�z��O�����̃��O}
\begin{narrow}[8mm]
���s���Ɋ��ϐ�{\tt SRPCS\_LOGFILE}�Ƀt�@�C���p�X��ݒ肵�Ă����΁A
�����Ŏw�肳�ꂽ�t�@�C����{\,\tt "CSUtility.cpp"\,}�ŗ�O�����������󋵂�
�o�͂��邱�Ƃ��ł���B

\medskip\medskip
���O�̃T���v�� {\small (�ꕔ�܂�Ԃ�)}
{\footnotesize
\begin{verbatim}
2106/07/25 11:51:49 [06088] DllMain: DLL_PROCESS_ATTACH: DLL is loaded dynamically.
2106/07/25 11:51:49 [06088]  --- set SEH translator (0x105BCAB0).
2106/07/25 11:51:49 [06088] ** managed-exception raiser registered **
2106/07/25 11:51:50 [06088] ** enter: se_translator **
2106/07/25 11:51:50 [06088] 
SEH_Exception: EXCEPTION_ACCESS_VIOLATION at 0x0FD6F58A
               Reading from address 0x00000005
stack trace:
0x001DE4D8: 
[0] 0x0FD73539 SprExport.dll: Spr::ObjectIf::AddRef  
               f:\project\springhead2\src\foundation\foundationstub.cpp: 217
[1] 0x0FD31BD7 SprExport.dll: Spr::UTRef<Spr::PHSceneIf>::UTRef<Spr::PHSceneIf>  
               f:\project\springhead2\include\base\baseutility.h: 132
[2] 0x1029ABFF SprExport.dll: Spr::PHSdk::AddChildObject  
               f:\project\springhead2\src\physics\phsdk.cpp: 187
[3] 0x1029A92E SprExport.dll: Spr::PHSdk::CreateShape  
               f:\project\springhead2\src\physics\phsdk.cpp: 155
[4] 0x1016CF59 SprExport.dll: Spr::PHSdkIf::CreateShape  
               f:\project\springhead2\src\physics\physicsstub.cpp: 3735
[5] 0x10538C4D SprExport.dll: Spr_PHSdkIf_CreateShape  
               f:\project\springhead2\src\sprcsharp\sprexport\csphysics.cpp: 11768
2106/07/25 11:51:50 [06088] ** leave: se_translator **
2106/07/25 11:51:56 [06088] DllMain: DLL_PROCESS_DETACH: 
                                     DLL will be released by process termination.
2106/07/25 11:51:56 [06088] - unset SEH translator (0x00000000).
\end{verbatim}
}
\end{narrow}

\end{document}
% end: main.tex
