Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/ttdebug.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9127 - (hide annotations) (download) (as text)
Sat Jan 16 05:20:46 2021 UTC (3 years, 2 months ago) by zmatsuo
Original Path: trunk/teraterm/teraterm/ttdebug.cpp
File MIME type: text/x-c++src
File size: 8802 byte(s)
imagehlp.dll の遅延ロード指定がなくても動作するようにした

- Windows95 には imagehlp.dll の SymGetLineFromAddr() が存在しない
1 zmatsuo 9124 /*
2     * (C) 2020- TeraTerm Project
3     * All rights reserved.
4     *
5     * Redistribution and use in source and binary forms, with or without
6     * modification, are permitted provided that the following conditions
7     * are met:
8     *
9     * 1. Redistributions of source code must retain the above copyright
10     * notice, this list of conditions and the following disclaimer.
11     * 2. Redistributions in binary form must reproduce the above copyright
12     * notice, this list of conditions and the following disclaimer in the
13     * documentation and/or other materials provided with the distribution.
14     * 3. The name of the author may not be used to endorse or promote products
15     * derived from this software without specific prior written permission.
16     *
17     * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
18     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
21     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27     */
28    
29     #include <windows.h>
30     #include <stdio.h>
31     #include <imagehlp.h>
32    
33     #include "compat_win.h"
34    
35     #include "ttdebug.h"
36    
37     /**
38     * �R���\�[���E�B���h�E���\�������f�o�O�p
39     * �f�o�O�p������������printf()�n���\����������������������������
40     *
41     * @retval �R���\�[����Window Handle
42     */
43     HWND DebugConsoleOpen(void)
44     {
45     FILE *fp;
46     HWND hWnd = pGetConsoleWindow();
47     if (hWnd != NULL) {
48     return hWnd;
49     }
50     AllocConsole();
51     freopen_s(&fp, "CONOUT$", "w", stdout);
52     freopen_s(&fp, "CONOUT$", "w", stderr);
53    
54     // �������{�^����������
55     hWnd = pGetConsoleWindow();
56     HMENU hmenu = GetSystemMenu(hWnd, FALSE);
57     RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);
58    
59     return hWnd;
60     }
61    
62     //
63     // ���O�n���h�����t�b�N�i�X�^�b�N�g���[�X���_���v�j
64     //
65     // cf. http://svn.collab.net/repos/svn/trunk/subversion/libsvn_subr/win32_crashrpt.c
66     // (2007.9.30 yutaka)
67     //
68     // ���O�R�[�h������������������
69     #if !defined(_M_X64)
70     static const char *GetExceptionString(DWORD exception)
71     {
72     #define EXCEPTION(x) case EXCEPTION_##x: return (#x);
73     static char buf[16];
74    
75     switch (exception)
76     {
77     EXCEPTION(ACCESS_VIOLATION)
78     EXCEPTION(DATATYPE_MISALIGNMENT)
79     EXCEPTION(BREAKPOINT)
80     EXCEPTION(SINGLE_STEP)
81     EXCEPTION(ARRAY_BOUNDS_EXCEEDED)
82     EXCEPTION(FLT_DENORMAL_OPERAND)
83     EXCEPTION(FLT_DIVIDE_BY_ZERO)
84     EXCEPTION(FLT_INEXACT_RESULT)
85     EXCEPTION(FLT_INVALID_OPERATION)
86     EXCEPTION(FLT_OVERFLOW)
87     EXCEPTION(FLT_STACK_CHECK)
88     EXCEPTION(FLT_UNDERFLOW)
89     EXCEPTION(INT_DIVIDE_BY_ZERO)
90     EXCEPTION(INT_OVERFLOW)
91     EXCEPTION(PRIV_INSTRUCTION)
92     EXCEPTION(IN_PAGE_ERROR)
93     EXCEPTION(ILLEGAL_INSTRUCTION)
94     EXCEPTION(NONCONTINUABLE_EXCEPTION)
95     EXCEPTION(STACK_OVERFLOW)
96     EXCEPTION(INVALID_DISPOSITION)
97     EXCEPTION(GUARD_PAGE)
98     EXCEPTION(INVALID_HANDLE)
99    
100     default:
101     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "0x%x", exception);
102     return buf;
103     //return "UNKNOWN_ERROR";
104     }
105     #undef EXCEPTION
106     }
107    
108     /* ���O�������������������o���������\�������A���O�t�B���^���� */
109     static LONG CALLBACK ApplicationFaultHandler(EXCEPTION_POINTERS *ExInfo)
110     {
111     HGLOBAL gptr;
112     STACKFRAME sf;
113     BOOL bResult;
114     PIMAGEHLP_SYMBOL pSym;
115     DWORD Disp;
116     HANDLE hProcess = GetCurrentProcess();
117     HANDLE hThread = GetCurrentThread();
118     IMAGEHLP_MODULE ih_module;
119     IMAGEHLP_LINE ih_line;
120     int frame;
121     char msg[3072], buf[256];
122     HMODULE h, h2;
123     char imagehlp_dll[MAX_PATH];
124 zmatsuo 9127 BOOL (WINAPI *pSymGetLineFromAddr)(HANDLE hProcess, DWORD dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINE Line);
125 zmatsuo 9124
126     // Windows98/Me/NT4�����������������X�L�b�v�����B(2007.10.9 yutaka)
127     GetSystemDirectory(imagehlp_dll, sizeof(imagehlp_dll));
128     strncat_s(imagehlp_dll, sizeof(imagehlp_dll), "\\imagehlp.dll", _TRUNCATE);
129     h2 = LoadLibrary(imagehlp_dll);
130 zmatsuo 9127 h = GetModuleHandle(imagehlp_dll);
131     if (h == NULL) {
132     FreeLibrary(h2);
133     goto error;
134 zmatsuo 9124 }
135 zmatsuo 9127 *(void **)&pSymGetLineFromAddr = (void *)GetProcAddress(h, "SymGetLineFromAddr");
136     if (pSymGetLineFromAddr == NULL) {
137     FreeLibrary(h2);
138     goto error;
139     }
140 zmatsuo 9124 FreeLibrary(h2);
141    
142     /* �V���{�������i�[�p�o�b�t�@�������� */
143     gptr = GlobalAlloc(GMEM_FIXED, 10000);
144     if (gptr == NULL) {
145     goto error;
146     }
147     pSym = (PIMAGEHLP_SYMBOL)GlobalLock(gptr);
148     ZeroMemory(pSym, sizeof(IMAGEHLP_SYMBOL));
149     pSym->SizeOfStruct = 10000;
150     pSym->MaxNameLength = 10000 - sizeof(IMAGEHLP_SYMBOL);
151    
152     /* �X�^�b�N�t���[���������� */
153     ZeroMemory(&sf, sizeof(sf));
154     sf.AddrPC.Offset = ExInfo->ContextRecord->Eip;
155     sf.AddrStack.Offset = ExInfo->ContextRecord->Esp;
156     sf.AddrFrame.Offset = ExInfo->ContextRecord->Ebp;
157     sf.AddrPC.Mode = AddrModeFlat;
158     sf.AddrStack.Mode = AddrModeFlat;
159     sf.AddrFrame.Mode = AddrModeFlat;
160    
161     /* �V���{���n���h���������� */
162     SymInitialize(hProcess, NULL, TRUE);
163    
164     // ���W�X�^�_���v
165     msg[0] = '\0';
166     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "eax=%08X ebx=%08X ecx=%08X edx=%08X esi=%08X edi=%08X\r\n"
167     "ebp=%08X esp=%08X eip=%08X efl=%08X\r\n"
168     "cs=%04X ss=%04X ds=%04X es=%04X fs=%04X gs=%04X\r\n",
169     ExInfo->ContextRecord->Eax,
170     ExInfo->ContextRecord->Ebx,
171     ExInfo->ContextRecord->Ecx,
172     ExInfo->ContextRecord->Edx,
173     ExInfo->ContextRecord->Esi,
174     ExInfo->ContextRecord->Edi,
175     ExInfo->ContextRecord->Ebp,
176     ExInfo->ContextRecord->Esp,
177     ExInfo->ContextRecord->Eip,
178     ExInfo->ContextRecord->EFlags,
179     ExInfo->ContextRecord->SegCs,
180     ExInfo->ContextRecord->SegSs,
181     ExInfo->ContextRecord->SegDs,
182     ExInfo->ContextRecord->SegEs,
183     ExInfo->ContextRecord->SegFs,
184     ExInfo->ContextRecord->SegGs
185     );
186     strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
187    
188     if (ExInfo->ExceptionRecord != NULL) {
189     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "Exception: %s\r\n", GetExceptionString(ExInfo->ExceptionRecord->ExceptionCode));
190     strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
191     }
192    
193     /* �X�^�b�N�t���[���������\���������� */
194     frame = 0;
195     for (;;) {
196     /* �����X�^�b�N�t���[�������� */
197     bResult = StackWalk(
198     IMAGE_FILE_MACHINE_I386,
199     hProcess,
200     hThread,
201     &sf,
202     NULL,
203     NULL,
204     SymFunctionTableAccess,
205     SymGetModuleBase,
206     NULL);
207    
208     /* ���s�������A���[�v�������� */
209     if (!bResult || sf.AddrFrame.Offset == 0)
210     break;
211    
212     frame++;
213    
214     /* �v���O�����J�E���^�i���z�A�h���X�j�������������I�t�Z�b�g������ */
215     bResult = SymGetSymFromAddr(hProcess, sf.AddrPC.Offset, &Disp, pSym);
216    
217     /* �����������\�� */
218     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "#%d 0x%08x in ", frame, sf.AddrPC.Offset);
219     strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
220     if (bResult) {
221     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s() + 0x%x ", pSym->Name, Disp);
222     strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
223     } else {
224     _snprintf_s(buf, sizeof(buf), _TRUNCATE, " --- ");
225     strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
226     }
227    
228     // ���s�t�@�C����������
229     ZeroMemory( &(ih_module), sizeof(ih_module) );
230     ih_module.SizeOfStruct = sizeof(ih_module);
231     bResult = SymGetModuleInfo( hProcess, sf.AddrPC.Offset, &(ih_module) );
232     strncat_s(msg, sizeof(msg), "at ", _TRUNCATE);
233     if (bResult) {
234     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s ", ih_module.ImageName );
235     strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
236     } else {
237     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s ", "<Unknown Module>" );
238     strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
239     }
240    
241     // �t�@�C�������s����������
242     ZeroMemory( &(ih_line), sizeof(ih_line) );
243     ih_line.SizeOfStruct = sizeof(ih_line);
244 zmatsuo 9127 bResult = pSymGetLineFromAddr( hProcess, sf.AddrPC.Offset, &Disp, &ih_line );
245 zmatsuo 9124 if (bResult)
246     {
247     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "%s:%lu", ih_line.FileName, ih_line.LineNumber );
248     strncat_s(msg, sizeof(msg), buf, _TRUNCATE);
249     }
250    
251     strncat_s(msg, sizeof(msg), "\n", _TRUNCATE);
252     }
253    
254     /* ������ */
255     SymCleanup(hProcess);
256     GlobalUnlock(pSym);
257     GlobalFree(pSym);
258    
259     // ���O�������������AAPI�����������o��
260     ::MessageBoxA(NULL, msg, "Tera Term: Application fault", MB_OK | MB_ICONEXCLAMATION);
261    
262     error:
263     // return (EXCEPTION_EXECUTE_HANDLER); /* ���������v���Z�X���I�������� */
264     return (EXCEPTION_CONTINUE_SEARCH); /* ���������m�A�v���P�[�V�����G���[�n�|�b�v�A�b�v���b�Z�[�W�{�b�N�X�������o�� */
265     }
266     #endif // !defined(_M_X64 )
267    
268    
269     /**
270     * ���O�n���h�����t�b�N
271     */
272     void DebugSetException(void)
273     {
274     #if !defined(_M_X64)
275     SetUnhandledExceptionFilter(ApplicationFaultHandler);
276     #endif
277     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26