Revisão | d740be2282b31ac3a3cd0de3872a812f17baadfa (tree) |
---|---|
Hora | 2008-09-09 16:58:32 |
Autor | eru <eru01@user...> |
Commiter | eru |
CoreのスレッドにSEHを設置
@@ -50,6 +50,8 @@ | ||
50 | 50 | #define new DEBUG_NEW |
51 | 51 | #endif |
52 | 52 | |
53 | +#include "win32/seh.h" | |
54 | + | |
53 | 55 | // ----------------------------------- |
54 | 56 | char *Channel::srcTypes[]= |
55 | 57 | { |
@@ -423,7 +425,7 @@ void Channel::checkReadDelay(unsigned int len) | ||
423 | 425 | |
424 | 426 | |
425 | 427 | // ----------------------------------- |
426 | -THREAD_PROC Channel::stream(ThreadInfo *thread) | |
428 | +THREAD_PROC Channel::streamMain(ThreadInfo *thread) | |
427 | 429 | { |
428 | 430 | // thread->lock(); |
429 | 431 |
@@ -483,10 +485,16 @@ THREAD_PROC Channel::stream(ThreadInfo *thread) | ||
483 | 485 | ch->endThread(true); |
484 | 486 | } |
485 | 487 | return 0; |
488 | +} | |
489 | + | |
490 | +// ----------------------------------- | |
491 | +THREAD_PROC Channel::stream(ThreadInfo *thread) | |
492 | +{ | |
493 | + SEH_THREAD(streamMain, Channel::stream); | |
486 | 494 | } |
487 | 495 | |
488 | 496 | // ----------------------------------- |
489 | -THREAD_PROC Channel::waitFinish(ThreadInfo *thread) | |
497 | +THREAD_PROC Channel::waitFinishMain(ThreadInfo *thread) | |
490 | 498 | { |
491 | 499 | Channel *ch = (Channel*)thread->data; |
492 | 500 | LOG_DEBUG("Wait channel finish"); |
@@ -507,6 +515,13 @@ THREAD_PROC Channel::waitFinish(ThreadInfo *thread) | ||
507 | 515 | } |
508 | 516 | |
509 | 517 | // ----------------------------------- |
518 | +THREAD_PROC Channel::waitFinish(ThreadInfo *thread) | |
519 | +{ | |
520 | + SEH_THREAD(waitFinishMain, Channel::waitFinish); | |
521 | +} | |
522 | + | |
523 | + | |
524 | +// ----------------------------------- | |
510 | 525 | bool Channel::acceptGIV(ClientSocket *givSock) |
511 | 526 | { |
512 | 527 | if (!pushSock) |
@@ -3041,7 +3056,7 @@ public: | ||
3041 | 3056 | bool keep; |
3042 | 3057 | }; |
3043 | 3058 | // ----------------------------------- |
3044 | -THREAD_PROC findAndPlayChannelProc(ThreadInfo *th) | |
3059 | +THREAD_PROC findAndPlayChannelProcMain(ThreadInfo *th) | |
3045 | 3060 | { |
3046 | 3061 | ChanFindInfo *cfi = (ChanFindInfo *)th; |
3047 | 3062 |
@@ -3069,6 +3084,13 @@ THREAD_PROC findAndPlayChannelProc(ThreadInfo *th) | ||
3069 | 3084 | delete cfi; |
3070 | 3085 | return 0; |
3071 | 3086 | } |
3087 | + | |
3088 | +// ----------------------------------- | |
3089 | +THREAD_PROC findAndPlayChannelProc(ThreadInfo *thread) | |
3090 | +{ | |
3091 | + SEH_THREAD(findAndPlayChannelProcMain, findAndPlayChannel); | |
3092 | +} | |
3093 | + | |
3072 | 3094 | // ----------------------------------- |
3073 | 3095 | void ChanMgr::findAndPlayChannel(ChanInfo &info, bool keep) |
3074 | 3096 | { |
@@ -443,8 +443,10 @@ public: | ||
443 | 443 | bool isIdle() {return isActive() && (status==S_IDLE);} |
444 | 444 | |
445 | 445 | static THREAD_PROC stream(ThreadInfo *); |
446 | + static THREAD_PROC streamMain(ThreadInfo *); | |
446 | 447 | |
447 | 448 | static THREAD_PROC waitFinish(ThreadInfo *); |
449 | + static THREAD_PROC waitFinishMain(ThreadInfo *); | |
448 | 450 | |
449 | 451 | void setStatus(STATUS s); |
450 | 452 | const char *getSrcTypeStr() {return srcTypes[srcType];} |
@@ -40,6 +40,8 @@ | ||
40 | 40 | #define new DEBUG_NEW |
41 | 41 | #endif |
42 | 42 | |
43 | +#include "win32/seh.h" | |
44 | + | |
43 | 45 | |
44 | 46 | const int DIRECT_WRITE_TIMEOUT = 60; |
45 | 47 |
@@ -1668,7 +1670,7 @@ void Servent::processRoot() | ||
1668 | 1670 | } |
1669 | 1671 | |
1670 | 1672 | // ----------------------------------- |
1671 | -int Servent::givProc(ThreadInfo *thread) | |
1673 | +int Servent::givProcMain(ThreadInfo *thread) | |
1672 | 1674 | { |
1673 | 1675 | // thread->lock(); |
1674 | 1676 | Servent *sv = (Servent*)thread->data; |
@@ -1688,6 +1690,12 @@ int Servent::givProc(ThreadInfo *thread) | ||
1688 | 1690 | } |
1689 | 1691 | |
1690 | 1692 | // ----------------------------------- |
1693 | +int Servent::givProc(ThreadInfo *thread) | |
1694 | +{ | |
1695 | + SEH_THREAD(givProcMain, Servent::givProc); | |
1696 | +} | |
1697 | + | |
1698 | +// ----------------------------------- | |
1691 | 1699 | void Servent::handshakeOutgoingPCP(AtomStream &atom, Host &rhost, GnuID &rid, String &agent, bool isTrusted) |
1692 | 1700 | { |
1693 | 1701 |
@@ -2128,7 +2136,7 @@ void Servent::processIncomingPCP(bool suggestOthers) | ||
2128 | 2136 | } |
2129 | 2137 | |
2130 | 2138 | // ----------------------------------- |
2131 | -int Servent::outgoingProc(ThreadInfo *thread) | |
2139 | +int Servent::outgoingProcMain(ThreadInfo *thread) | |
2132 | 2140 | { |
2133 | 2141 | // thread->lock(); |
2134 | 2142 | LOG_DEBUG("COUT started"); |
@@ -2309,7 +2317,12 @@ int Servent::outgoingProc(ThreadInfo *thread) | ||
2309 | 2317 | return 0; |
2310 | 2318 | } |
2311 | 2319 | // ----------------------------------- |
2312 | -int Servent::incomingProc(ThreadInfo *thread) | |
2320 | +int Servent::outgoingProc(ThreadInfo *thread) | |
2321 | +{ | |
2322 | + SEH_THREAD(outgoingProcMain, Servent::outgoingProc); | |
2323 | +} | |
2324 | +// ----------------------------------- | |
2325 | +int Servent::incomingProcMain(ThreadInfo *thread) | |
2313 | 2326 | { |
2314 | 2327 | // thread->lock(); |
2315 | 2328 |
@@ -2342,6 +2355,11 @@ int Servent::incomingProc(ThreadInfo *thread) | ||
2342 | 2355 | return 0; |
2343 | 2356 | } |
2344 | 2357 | // ----------------------------------- |
2358 | +int Servent::incomingProc(ThreadInfo *thread) | |
2359 | +{ | |
2360 | + SEH_THREAD(incomingProcMain, Servent::incomingProc); | |
2361 | +} | |
2362 | +// ----------------------------------- | |
2345 | 2363 | void Servent::processServent() |
2346 | 2364 | { |
2347 | 2365 | setStatus(S_HANDSHAKE); |
@@ -2986,7 +3004,7 @@ void Servent::sendPCPChannel() | ||
2986 | 3004 | } |
2987 | 3005 | |
2988 | 3006 | // ----------------------------------- |
2989 | -int Servent::serverProc(ThreadInfo *thread) | |
3007 | +int Servent::serverProcMain(ThreadInfo *thread) | |
2990 | 3008 | { |
2991 | 3009 | // thread->lock(); |
2992 | 3010 |
@@ -3053,6 +3071,12 @@ int Servent::serverProc(ThreadInfo *thread) | ||
3053 | 3071 | sys->endThread(thread); |
3054 | 3072 | return 0; |
3055 | 3073 | } |
3074 | + | |
3075 | +// ----------------------------------- | |
3076 | +int Servent::serverProc(ThreadInfo *thread) | |
3077 | +{ | |
3078 | + SEH_THREAD(serverProcMain, Servent::serverProc); | |
3079 | +} | |
3056 | 3080 | |
3057 | 3081 | // ----------------------------------- |
3058 | 3082 | bool Servent::writeVariable(Stream &s, const String &var) |
@@ -144,9 +144,13 @@ public: | ||
144 | 144 | |
145 | 145 | // static funcs that do the actual work in the servent thread |
146 | 146 | static THREAD_PROC serverProc(ThreadInfo *); |
147 | + static THREAD_PROC serverProcMain(ThreadInfo *); | |
147 | 148 | static THREAD_PROC outgoingProc(ThreadInfo *); |
149 | + static THREAD_PROC outgoingProcMain(ThreadInfo *); | |
148 | 150 | static THREAD_PROC incomingProc(ThreadInfo *); |
151 | + static THREAD_PROC incomingProcMain(ThreadInfo *); | |
149 | 152 | static THREAD_PROC givProc(ThreadInfo *); |
153 | + static THREAD_PROC givProcMain(ThreadInfo *); | |
150 | 154 | static THREAD_PROC pcpProc(ThreadInfo *); |
151 | 155 | static THREAD_PROC fetchProc(ThreadInfo *); |
152 | 156 |
@@ -44,9 +44,9 @@ extern int version_ex; // PP | ||
44 | 44 | #if 1 /* for VP extend version */ |
45 | 45 | //#define VERSION_EX 1 |
46 | 46 | static const char *PCP_CLIENT_VERSION_EX_PREFIX = "IM"; // 2bytes only |
47 | -static const int PCP_CLIENT_VERSION_EX_NUMBER = 28; | |
48 | -static const char *PCX_AGENTEX = "PeerCast/0.1218(IM0028-3)"; | |
49 | -static const char *PCX_VERSTRING_EX = "v0.1218(IM0028-3)"; | |
47 | +static const int PCP_CLIENT_VERSION_EX_NUMBER = 29; | |
48 | +static const char *PCX_AGENTEX = "PeerCast/0.1218(IM0029)"; | |
49 | +static const char *PCX_VERSTRING_EX = "v0.1218(IM0029)"; | |
50 | 50 | #endif |
51 | 51 | |
52 | 52 | // ------------------------------------------------ |
@@ -212,6 +212,7 @@ | ||
212 | 212 | ProgramDataBaseFileName=".\Release/" |
213 | 213 | WarningLevel="3" |
214 | 214 | SuppressStartupBanner="true" |
215 | + DebugInformationFormat="3" | |
215 | 216 | /> |
216 | 217 | <Tool |
217 | 218 | Name="VCManagedResourceCompilerTool" |
@@ -1374,6 +1375,10 @@ | ||
1374 | 1375 | Name="Win32 Source" |
1375 | 1376 | > |
1376 | 1377 | <File |
1378 | + RelativePath="..\seh.cpp" | |
1379 | + > | |
1380 | + </File> | |
1381 | + <File | |
1377 | 1382 | RelativePath="..\wsocket.cpp" |
1378 | 1383 | > |
1379 | 1384 | <FileConfiguration |
@@ -1458,6 +1463,10 @@ | ||
1458 | 1463 | Name="Win32 Includes" |
1459 | 1464 | > |
1460 | 1465 | <File |
1466 | + RelativePath="..\seh.h" | |
1467 | + > | |
1468 | + </File> | |
1469 | + <File | |
1461 | 1470 | RelativePath="..\wsocket.h" |
1462 | 1471 | > |
1463 | 1472 | </File> |
@@ -0,0 +1,41 @@ | ||
1 | +#include "win32/seh.h" | |
2 | + | |
3 | +void SEHdump(_EXCEPTION_POINTERS *lpExcept) | |
4 | +{ | |
5 | + // crash dump | |
6 | + MINIDUMP_EXCEPTION_INFORMATION minidumpInfo; | |
7 | + HANDLE hFile; | |
8 | + BOOL dump = FALSE; | |
9 | + | |
10 | + minidumpInfo.ThreadId = GetCurrentThreadId(); | |
11 | + minidumpInfo.ExceptionPointers = lpExcept; | |
12 | + minidumpInfo.ClientPointers = FALSE; | |
13 | + | |
14 | + hFile = CreateFile(".\\dump.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | |
15 | + if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) | |
16 | + { | |
17 | + dump = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, | |
18 | + (MINIDUMP_TYPE)(MiniDumpWithIndirectlyReferencedMemory|MiniDumpScanMemory), | |
19 | + &minidumpInfo, NULL, NULL); | |
20 | + CloseHandle(hFile); | |
21 | + } | |
22 | + | |
23 | + | |
24 | + // dump peercast's log | |
25 | + fs.openWriteReplace(".\\dump.html"); | |
26 | + sys->logBuf->dumpHTML(fs); | |
27 | + fs.close(); | |
28 | + if (dump) | |
29 | + { | |
30 | + MessageBox(NULL, "一般保護違反の為、プログラムは強制終了されます。\n" | |
31 | + "問題解決のためダンプデータ(dump.html, dump.dmp)を提供してください。", "SEH", | |
32 | + MB_OK|MB_ICONWARNING); | |
33 | + } else | |
34 | + { | |
35 | + MessageBox(NULL, "一般保護違反の為、プログラムは強制終了されます。\n" | |
36 | + "問題解決のためにダンプデータ(dump.html)を提供してください。", "SEH", | |
37 | + MB_OK|MB_ICONWARNING); | |
38 | + } | |
39 | + | |
40 | + ::exit(lpExcept->ExceptionRecord->ExceptionCode); | |
41 | +} |
@@ -0,0 +1,24 @@ | ||
1 | +#ifndef _SEH_H_ | |
2 | +#define _SEH_H_ | |
3 | + | |
4 | +#include "stream.h" | |
5 | +#include <dbghelp.h> | |
6 | + | |
7 | +#pragma once | |
8 | +#pragma comment(lib, "dbghelp.lib") | |
9 | + | |
10 | +extern FileStream fs; | |
11 | + | |
12 | +#define SEH_THREAD(func, name) \ | |
13 | +{ \ | |
14 | + __try \ | |
15 | + { \ | |
16 | + return func(thread); \ | |
17 | + } __except(SEHdump(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) \ | |
18 | + { \ | |
19 | + } \ | |
20 | +} \ | |
21 | + | |
22 | +void SEHdump(_EXCEPTION_POINTERS *); | |
23 | + | |
24 | +#endif |
@@ -408,225 +408,55 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
408 | 408 | int nCmdShow) |
409 | 409 | { |
410 | 410 | // SEH handling |
411 | + _EXCEPTION_POINTERS *lpExcept; | |
411 | 412 | __try |
412 | 413 | { |
413 | -#if 0 | |
414 | -#ifdef _DEBUG | |
415 | - // memory leak check | |
416 | - ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); | |
417 | -#endif | |
418 | - | |
419 | - char tmpURL[8192]; | |
420 | - tmpURL[0]=0; | |
421 | - char *chanURL=NULL; | |
422 | - | |
423 | - hInst = hInstance; | |
424 | - | |
425 | - version_ex = 1; // PP版拡張機能を無効に←大嘘。バージョン表記をEXに | |
426 | - | |
427 | - iniFileName.set(".\\peercast.ini"); | |
428 | - | |
429 | - WIN32_FIND_DATA fd; //JP-EX | |
430 | - HANDLE hFind; //JP-EX | |
431 | - | |
432 | - OSVERSIONINFO osInfo; //JP-EX | |
433 | - osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); //JP-EX | |
434 | - GetVersionEx(&osInfo); | |
435 | - if (osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) | |
436 | - winDistinctionNT = true; | |
437 | - else | |
438 | - winDistinctionNT = false; | |
439 | - | |
440 | - // off by default now | |
441 | - showGUI = false; | |
442 | - | |
443 | - if (strlen(lpCmdLine) > 0) | |
444 | - { | |
445 | - char *p; | |
446 | - if ((p = strstr(lpCmdLine,"-inifile"))!=NULL) | |
447 | - iniFileName.setFromString(p+8); | |
448 | - | |
449 | - if (strstr(lpCmdLine,"-zen")) | |
450 | - showGUI = false; | |
451 | - | |
452 | - if (strstr(lpCmdLine,"-multi")) | |
453 | - allowMulti = true; | |
454 | - | |
455 | - if (strstr(lpCmdLine,"-kill")) | |
456 | - killMe = true; | |
457 | - | |
458 | - if ((p = strstr(lpCmdLine,"-url"))!=NULL) | |
459 | - { | |
460 | - p+=4; | |
461 | - while (*p) | |
462 | - { | |
463 | - if (*p=='"') | |
464 | - { | |
465 | - p++; | |
466 | - break; | |
467 | - } | |
468 | - if (*p != ' ') | |
469 | - break; | |
470 | - p++; | |
471 | - } | |
472 | - if (*p) | |
473 | - strncpy(tmpURL,p,sizeof(tmpURL)-1); | |
474 | - } | |
475 | - } | |
476 | - | |
477 | - // get current path | |
478 | - { | |
479 | - exePath = iniFileName; | |
480 | - char *s = exePath.cstr(); | |
481 | - char *end = NULL; | |
482 | - while (*s) | |
483 | - { | |
484 | - if (*s++ == '\\') | |
485 | - end = s; | |
486 | - } | |
487 | - if (end) | |
488 | - *end = 0; | |
489 | - } | |
490 | - | |
491 | - | |
492 | - if (strnicmp(tmpURL,"peercast://",11)==0) | |
493 | - { | |
494 | - if (strnicmp(tmpURL+11,"pls/",4)==0) | |
495 | - chanURL = tmpURL+11+4; | |
496 | - else | |
497 | - chanURL = tmpURL+11; | |
498 | - showGUI = false; | |
499 | - } | |
500 | - | |
501 | - | |
502 | - MSG msg; | |
503 | - HACCEL hAccelTable; | |
504 | - | |
505 | - // Initialize global strings | |
506 | - //LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); | |
507 | - //LoadString(hInstance, IDC_APP_TITLE, szWindowClass, MAX_LOADSTRING); | |
414 | + WinMainDummy(hInstance, hPrevInstance, lpCmdLine, nCmdShow); | |
508 | 415 | |
509 | - strcpy(szTitle,"PeerCast"); | |
510 | - strcpy(szWindowClass,"PeerCast"); | |
511 | - strcpy(szWindowClass2,"Main"); | |
416 | + } __except(lpExcept = GetExceptionInformation(), EXCEPTION_EXECUTE_HANDLER) | |
417 | + { | |
418 | + DWORD nParams; | |
512 | 419 | |
513 | - if (!allowMulti) | |
420 | + fs.openWriteReplace(".\\dump.txt"); | |
421 | + fs.writeLine("Exception Point: WinMain"); | |
422 | + fs.write("Exception: ", 11); | |
423 | + switch (lpExcept->ExceptionRecord->ExceptionCode) | |
514 | 424 | { |
515 | - HANDLE mutex = CreateMutex(NULL,TRUE,szWindowClass); | |
516 | - | |
517 | - if (GetLastError() == ERROR_ALREADY_EXISTS) | |
518 | - { | |
519 | - HWND oldWin = FindWindow(szWindowClass,NULL); | |
520 | - if (oldWin) | |
521 | - { | |
522 | - //SendMessage(oldWin,WM_SHOWGUI,0,0); | |
523 | - if (killMe) | |
524 | - { | |
525 | - SendMessage(oldWin,WM_DESTROY,0,0); | |
526 | - return 0; | |
527 | - } | |
528 | - | |
529 | - if (chanURL) | |
530 | - { | |
531 | - COPYDATASTRUCT copy; | |
532 | - copy.dwData = WM_PLAYCHANNEL; | |
533 | - copy.cbData = strlen(chanURL)+1; // plus null term | |
534 | - copy.lpData = chanURL; | |
535 | - SendMessage(oldWin,WM_COPYDATA,NULL,(LPARAM)©); | |
536 | - }else{ | |
537 | - if (showGUI) | |
538 | - SendMessage(oldWin,WM_SHOWGUI,0,0); | |
539 | - } | |
540 | - } | |
541 | - return 0; | |
542 | - } | |
543 | - } | |
544 | - | |
545 | - if (killMe) | |
546 | - return 0; | |
547 | - | |
548 | - MyRegisterClass(hInstance); | |
549 | - MyRegisterClass2(hInstance); | |
550 | - | |
551 | - // Perform application initialization: | |
552 | - if (!InitInstance (hInstance, nCmdShow)) | |
553 | - return FALSE; | |
554 | - | |
555 | - peercastInst = new MyPeercastInst(); | |
556 | - peercastApp = new MyPeercastApp(); | |
557 | - | |
558 | - peercastInst->init(); | |
559 | - | |
560 | - LOG_DEBUG("Set OS Type: %s",winDistinctionNT?"WinNT":"Win9x"); | |
425 | + case EXCEPTION_ACCESS_VIOLATION: | |
426 | + fs.writeLine("Access violation"); | |
427 | + break; | |
561 | 428 | |
562 | - if (peercastApp->clearTemp()) //JP-EX | |
563 | - { | |
564 | - DeleteFile("play.pls"); | |
565 | - hFind = FindFirstFile("*.asx",&fd); | |
566 | - if (hFind != INVALID_HANDLE_VALUE) | |
567 | - { | |
568 | - do | |
569 | - { | |
570 | - DeleteFile((char *)&fd.cFileName); | |
571 | - } | |
572 | - while (FindNextFile(hFind,&fd)); | |
429 | + case EXCEPTION_FLT_DIVIDE_BY_ZERO: | |
430 | + case EXCEPTION_INT_DIVIDE_BY_ZERO: | |
431 | + fs.writeLine("Divide by zero"); | |
432 | + break; | |
573 | 433 | |
574 | - FindClose(hFind); | |
575 | - } | |
576 | - } | |
434 | + case EXCEPTION_STACK_OVERFLOW: | |
435 | + fs.writeLine("Stack overflow"); | |
436 | + break; | |
577 | 437 | |
578 | - if (chanURL) | |
579 | - { | |
580 | - ChanInfo info; | |
581 | - servMgr->procConnectArgs(chanURL,info); | |
582 | - chanMgr->findAndPlayChannel(info,false); | |
438 | + default: | |
439 | + fs.writeLong(lpExcept->ExceptionRecord->ExceptionCode); | |
440 | + fs.writeLine(""); | |
583 | 441 | } |
584 | 442 | |
585 | - hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SIMPLE); | |
586 | - | |
587 | - // setup menu notifes | |
588 | - int mask = peercastInst->getNotifyMask(); | |
589 | - if (mask & ServMgr::NT_PEERCAST) | |
590 | - CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_PEERCAST,MF_CHECKED|MF_BYCOMMAND); | |
591 | - if (mask & ServMgr::NT_BROADCASTERS) | |
592 | - CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_BROADCASTERS,MF_CHECKED|MF_BYCOMMAND); | |
593 | - if (mask & ServMgr::NT_TRACKINFO) | |
594 | - CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_TRACKINFO,MF_CHECKED|MF_BYCOMMAND); | |
443 | + fs.writeLineF("Address: %p", lpExcept->ExceptionRecord->ExceptionAddress); | |
595 | 444 | |
596 | - if (servMgr->startWithGui) | |
445 | + fs.writeLine("Additional information:"); | |
446 | + nParams = lpExcept->ExceptionRecord->NumberParameters; | |
447 | + for (unsigned i=0; i<nParams; ++i) | |
597 | 448 | { |
598 | - createGUI((HWND)0); | |
449 | + fs.writeLineF("%d: %lu", i, lpExcept->ExceptionRecord->ExceptionInformation[i]); | |
599 | 450 | } |
451 | + fs.close(); | |
600 | 452 | |
601 | - // Main message loop: | |
602 | - while (GetMessage(&msg, NULL, 0, 0)) | |
603 | - { | |
604 | - if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) | |
605 | - { | |
606 | - TranslateMessage(&msg); | |
607 | - DispatchMessage(&msg); | |
608 | - } | |
609 | - } | |
610 | - | |
611 | - Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA*)&trayIcon); | |
612 | - | |
613 | - peercastInst->saveSettings(); | |
614 | - peercastInst->quit(); | |
615 | - | |
616 | - Gdiplus::GdiplusShutdown(gdiplusToken); | |
617 | 453 | |
618 | - return msg.wParam; | |
619 | -#endif | |
620 | - WinMainDummy(hInstance, hPrevInstance, lpCmdLine, nCmdShow); | |
621 | - | |
622 | - } __except(EXCEPTION_EXECUTE_HANDLER) | |
623 | - { | |
624 | 454 | fs.openWriteReplace(".\\dump.html"); |
625 | 455 | sys->logBuf->dumpHTML(fs); |
626 | 456 | fs.close(); |
627 | 457 | |
628 | 458 | MessageBox(NULL, "一般保護違反の為、プログラムは強制終了されます。\n" |
629 | - "問題解決のためにダンプデータ(dump.html)を提供してください。", "SEH", | |
459 | + "問題解決のためにダンプデータ(dump.html, dump.txt)を提供してください。", "SEH", | |
630 | 460 | MB_OK|MB_ICONWARNING); |
631 | 461 | |
632 | 462 | return GetExceptionCode(); |
@@ -168,6 +168,7 @@ | ||
168 | 168 | BrowseInformation="1" |
169 | 169 | WarningLevel="3" |
170 | 170 | SuppressStartupBanner="true" |
171 | + DebugInformationFormat="3" | |
171 | 172 | /> |
172 | 173 | <Tool |
173 | 174 | Name="VCManagedResourceCompilerTool" |
@@ -187,7 +188,9 @@ | ||
187 | 188 | LinkIncremental="1" |
188 | 189 | SuppressStartupBanner="true" |
189 | 190 | AdditionalLibraryDirectories=""C:\Visual Studio Projects\PeCa-IMAS7651\core\win32\lib\Release"" |
191 | + GenerateDebugInformation="true" | |
190 | 192 | ProgramDatabaseFile=".\Release/PeerCast.pdb" |
193 | + GenerateMapFile="true" | |
191 | 194 | SubSystem="2" |
192 | 195 | RandomizedBaseAddress="1" |
193 | 196 | DataExecutionPrevention="0" |
@@ -50,6 +50,8 @@ | ||
50 | 50 | #define new DEBUG_NEW |
51 | 51 | #endif |
52 | 52 | |
53 | +#include "win32/seh.h" | |
54 | + | |
53 | 55 | // ----------------------------------- |
54 | 56 | char *Channel::srcTypes[]= |
55 | 57 | { |
@@ -423,7 +425,7 @@ void Channel::checkReadDelay(unsigned int len) | ||
423 | 425 | |
424 | 426 | |
425 | 427 | // ----------------------------------- |
426 | -THREAD_PROC Channel::stream(ThreadInfo *thread) | |
428 | +THREAD_PROC Channel::streamMain(ThreadInfo *thread) | |
427 | 429 | { |
428 | 430 | // thread->lock(); |
429 | 431 |
@@ -483,10 +485,16 @@ THREAD_PROC Channel::stream(ThreadInfo *thread) | ||
483 | 485 | ch->endThread(true); |
484 | 486 | } |
485 | 487 | return 0; |
488 | +} | |
489 | + | |
490 | +// ----------------------------------- | |
491 | +THREAD_PROC Channel::stream(ThreadInfo *thread) | |
492 | +{ | |
493 | + SEH_THREAD(streamMain, Channel::stream); | |
486 | 494 | } |
487 | 495 | |
488 | 496 | // ----------------------------------- |
489 | -THREAD_PROC Channel::waitFinish(ThreadInfo *thread) | |
497 | +THREAD_PROC Channel::waitFinishMain(ThreadInfo *thread) | |
490 | 498 | { |
491 | 499 | Channel *ch = (Channel*)thread->data; |
492 | 500 | LOG_DEBUG("Wait channel finish"); |
@@ -507,6 +515,13 @@ THREAD_PROC Channel::waitFinish(ThreadInfo *thread) | ||
507 | 515 | } |
508 | 516 | |
509 | 517 | // ----------------------------------- |
518 | +THREAD_PROC Channel::waitFinish(ThreadInfo *thread) | |
519 | +{ | |
520 | + SEH_THREAD(waitFinishMain, Channel::waitFinish); | |
521 | +} | |
522 | + | |
523 | + | |
524 | +// ----------------------------------- | |
510 | 525 | bool Channel::acceptGIV(ClientSocket *givSock) |
511 | 526 | { |
512 | 527 | if (!pushSock) |
@@ -3041,7 +3056,7 @@ public: | ||
3041 | 3056 | bool keep; |
3042 | 3057 | }; |
3043 | 3058 | // ----------------------------------- |
3044 | -THREAD_PROC findAndPlayChannelProc(ThreadInfo *th) | |
3059 | +THREAD_PROC findAndPlayChannelProcMain(ThreadInfo *th) | |
3045 | 3060 | { |
3046 | 3061 | ChanFindInfo *cfi = (ChanFindInfo *)th; |
3047 | 3062 |
@@ -3069,6 +3084,13 @@ THREAD_PROC findAndPlayChannelProc(ThreadInfo *th) | ||
3069 | 3084 | delete cfi; |
3070 | 3085 | return 0; |
3071 | 3086 | } |
3087 | + | |
3088 | +// ----------------------------------- | |
3089 | +THREAD_PROC findAndPlayChannelProc(ThreadInfo *thread) | |
3090 | +{ | |
3091 | + SEH_THREAD(findAndPlayChannelProcMain, findAndPlayChannel); | |
3092 | +} | |
3093 | + | |
3072 | 3094 | // ----------------------------------- |
3073 | 3095 | void ChanMgr::findAndPlayChannel(ChanInfo &info, bool keep) |
3074 | 3096 | { |
@@ -443,8 +443,10 @@ public: | ||
443 | 443 | bool isIdle() {return isActive() && (status==S_IDLE);} |
444 | 444 | |
445 | 445 | static THREAD_PROC stream(ThreadInfo *); |
446 | + static THREAD_PROC streamMain(ThreadInfo *); | |
446 | 447 | |
447 | 448 | static THREAD_PROC waitFinish(ThreadInfo *); |
449 | + static THREAD_PROC waitFinishMain(ThreadInfo *); | |
448 | 450 | |
449 | 451 | void setStatus(STATUS s); |
450 | 452 | const char *getSrcTypeStr() {return srcTypes[srcType];} |
@@ -40,6 +40,8 @@ | ||
40 | 40 | #define new DEBUG_NEW |
41 | 41 | #endif |
42 | 42 | |
43 | +#include "win32/seh.h" | |
44 | + | |
43 | 45 | |
44 | 46 | const int DIRECT_WRITE_TIMEOUT = 60; |
45 | 47 |
@@ -1668,7 +1670,7 @@ void Servent::processRoot() | ||
1668 | 1670 | } |
1669 | 1671 | |
1670 | 1672 | // ----------------------------------- |
1671 | -int Servent::givProc(ThreadInfo *thread) | |
1673 | +int Servent::givProcMain(ThreadInfo *thread) | |
1672 | 1674 | { |
1673 | 1675 | // thread->lock(); |
1674 | 1676 | Servent *sv = (Servent*)thread->data; |
@@ -1688,6 +1690,12 @@ int Servent::givProc(ThreadInfo *thread) | ||
1688 | 1690 | } |
1689 | 1691 | |
1690 | 1692 | // ----------------------------------- |
1693 | +int Servent::givProc(ThreadInfo *thread) | |
1694 | +{ | |
1695 | + SEH_THREAD(givProcMain, Servent::givProc); | |
1696 | +} | |
1697 | + | |
1698 | +// ----------------------------------- | |
1691 | 1699 | void Servent::handshakeOutgoingPCP(AtomStream &atom, Host &rhost, GnuID &rid, String &agent, bool isTrusted) |
1692 | 1700 | { |
1693 | 1701 |
@@ -2128,7 +2136,7 @@ void Servent::processIncomingPCP(bool suggestOthers) | ||
2128 | 2136 | } |
2129 | 2137 | |
2130 | 2138 | // ----------------------------------- |
2131 | -int Servent::outgoingProc(ThreadInfo *thread) | |
2139 | +int Servent::outgoingProcMain(ThreadInfo *thread) | |
2132 | 2140 | { |
2133 | 2141 | // thread->lock(); |
2134 | 2142 | LOG_DEBUG("COUT started"); |
@@ -2309,7 +2317,12 @@ int Servent::outgoingProc(ThreadInfo *thread) | ||
2309 | 2317 | return 0; |
2310 | 2318 | } |
2311 | 2319 | // ----------------------------------- |
2312 | -int Servent::incomingProc(ThreadInfo *thread) | |
2320 | +int Servent::outgoingProc(ThreadInfo *thread) | |
2321 | +{ | |
2322 | + SEH_THREAD(outgoingProcMain, Servent::outgoingProc); | |
2323 | +} | |
2324 | +// ----------------------------------- | |
2325 | +int Servent::incomingProcMain(ThreadInfo *thread) | |
2313 | 2326 | { |
2314 | 2327 | // thread->lock(); |
2315 | 2328 |
@@ -2342,6 +2355,11 @@ int Servent::incomingProc(ThreadInfo *thread) | ||
2342 | 2355 | return 0; |
2343 | 2356 | } |
2344 | 2357 | // ----------------------------------- |
2358 | +int Servent::incomingProc(ThreadInfo *thread) | |
2359 | +{ | |
2360 | + SEH_THREAD(incomingProcMain, Servent::incomingProc); | |
2361 | +} | |
2362 | +// ----------------------------------- | |
2345 | 2363 | void Servent::processServent() |
2346 | 2364 | { |
2347 | 2365 | setStatus(S_HANDSHAKE); |
@@ -2986,7 +3004,7 @@ void Servent::sendPCPChannel() | ||
2986 | 3004 | } |
2987 | 3005 | |
2988 | 3006 | // ----------------------------------- |
2989 | -int Servent::serverProc(ThreadInfo *thread) | |
3007 | +int Servent::serverProcMain(ThreadInfo *thread) | |
2990 | 3008 | { |
2991 | 3009 | // thread->lock(); |
2992 | 3010 |
@@ -3053,6 +3071,12 @@ int Servent::serverProc(ThreadInfo *thread) | ||
3053 | 3071 | sys->endThread(thread); |
3054 | 3072 | return 0; |
3055 | 3073 | } |
3074 | + | |
3075 | +// ----------------------------------- | |
3076 | +int Servent::serverProc(ThreadInfo *thread) | |
3077 | +{ | |
3078 | + SEH_THREAD(serverProcMain, Servent::serverProc); | |
3079 | +} | |
3056 | 3080 | |
3057 | 3081 | // ----------------------------------- |
3058 | 3082 | bool Servent::writeVariable(Stream &s, const String &var) |
@@ -144,9 +144,13 @@ public: | ||
144 | 144 | |
145 | 145 | // static funcs that do the actual work in the servent thread |
146 | 146 | static THREAD_PROC serverProc(ThreadInfo *); |
147 | + static THREAD_PROC serverProcMain(ThreadInfo *); | |
147 | 148 | static THREAD_PROC outgoingProc(ThreadInfo *); |
149 | + static THREAD_PROC outgoingProcMain(ThreadInfo *); | |
148 | 150 | static THREAD_PROC incomingProc(ThreadInfo *); |
151 | + static THREAD_PROC incomingProcMain(ThreadInfo *); | |
149 | 152 | static THREAD_PROC givProc(ThreadInfo *); |
153 | + static THREAD_PROC givProcMain(ThreadInfo *); | |
150 | 154 | static THREAD_PROC pcpProc(ThreadInfo *); |
151 | 155 | static THREAD_PROC fetchProc(ThreadInfo *); |
152 | 156 |
@@ -44,9 +44,9 @@ extern int version_ex; // PP | ||
44 | 44 | #if 1 /* for VP extend version */ |
45 | 45 | //#define VERSION_EX 1 |
46 | 46 | static const char *PCP_CLIENT_VERSION_EX_PREFIX = "IM"; // 2bytes only |
47 | -static const int PCP_CLIENT_VERSION_EX_NUMBER = 28; | |
48 | -static const char *PCX_AGENTEX = "PeerCast/0.1218(IM0028-3)"; | |
49 | -static const char *PCX_VERSTRING_EX = "v0.1218(IM0028-3)"; | |
47 | +static const int PCP_CLIENT_VERSION_EX_NUMBER = 29; | |
48 | +static const char *PCX_AGENTEX = "PeerCast/0.1218(IM0029)"; | |
49 | +static const char *PCX_VERSTRING_EX = "v0.1218(IM0029)"; | |
50 | 50 | #endif |
51 | 51 | |
52 | 52 | // ------------------------------------------------ |
@@ -212,6 +212,7 @@ | ||
212 | 212 | ProgramDataBaseFileName=".\Release/" |
213 | 213 | WarningLevel="3" |
214 | 214 | SuppressStartupBanner="true" |
215 | + DebugInformationFormat="3" | |
215 | 216 | /> |
216 | 217 | <Tool |
217 | 218 | Name="VCManagedResourceCompilerTool" |
@@ -1374,6 +1375,10 @@ | ||
1374 | 1375 | Name="Win32 Source" |
1375 | 1376 | > |
1376 | 1377 | <File |
1378 | + RelativePath="..\seh.cpp" | |
1379 | + > | |
1380 | + </File> | |
1381 | + <File | |
1377 | 1382 | RelativePath="..\wsocket.cpp" |
1378 | 1383 | > |
1379 | 1384 | <FileConfiguration |
@@ -1458,6 +1463,10 @@ | ||
1458 | 1463 | Name="Win32 Includes" |
1459 | 1464 | > |
1460 | 1465 | <File |
1466 | + RelativePath="..\seh.h" | |
1467 | + > | |
1468 | + </File> | |
1469 | + <File | |
1461 | 1470 | RelativePath="..\wsocket.h" |
1462 | 1471 | > |
1463 | 1472 | </File> |
@@ -0,0 +1,41 @@ | ||
1 | +#include "win32/seh.h" | |
2 | + | |
3 | +void SEHdump(_EXCEPTION_POINTERS *lpExcept) | |
4 | +{ | |
5 | + // crash dump | |
6 | + MINIDUMP_EXCEPTION_INFORMATION minidumpInfo; | |
7 | + HANDLE hFile; | |
8 | + BOOL dump = FALSE; | |
9 | + | |
10 | + minidumpInfo.ThreadId = GetCurrentThreadId(); | |
11 | + minidumpInfo.ExceptionPointers = lpExcept; | |
12 | + minidumpInfo.ClientPointers = FALSE; | |
13 | + | |
14 | + hFile = CreateFile(".\\dump.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | |
15 | + if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE)) | |
16 | + { | |
17 | + dump = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, | |
18 | + (MINIDUMP_TYPE)(MiniDumpWithIndirectlyReferencedMemory|MiniDumpScanMemory), | |
19 | + &minidumpInfo, NULL, NULL); | |
20 | + CloseHandle(hFile); | |
21 | + } | |
22 | + | |
23 | + | |
24 | + // dump peercast's log | |
25 | + fs.openWriteReplace(".\\dump.html"); | |
26 | + sys->logBuf->dumpHTML(fs); | |
27 | + fs.close(); | |
28 | + if (dump) | |
29 | + { | |
30 | + MessageBox(NULL, "一般保護違反の為、プログラムは強制終了されます。\n" | |
31 | + "問題解決のためダンプデータ(dump.html, dump.dmp)を提供してください。", "SEH", | |
32 | + MB_OK|MB_ICONWARNING); | |
33 | + } else | |
34 | + { | |
35 | + MessageBox(NULL, "一般保護違反の為、プログラムは強制終了されます。\n" | |
36 | + "問題解決のためにダンプデータ(dump.html)を提供してください。", "SEH", | |
37 | + MB_OK|MB_ICONWARNING); | |
38 | + } | |
39 | + | |
40 | + ::exit(lpExcept->ExceptionRecord->ExceptionCode); | |
41 | +} |
@@ -0,0 +1,24 @@ | ||
1 | +#ifndef _SEH_H_ | |
2 | +#define _SEH_H_ | |
3 | + | |
4 | +#include "stream.h" | |
5 | +#include <dbghelp.h> | |
6 | + | |
7 | +#pragma once | |
8 | +#pragma comment(lib, "dbghelp.lib") | |
9 | + | |
10 | +extern FileStream fs; | |
11 | + | |
12 | +#define SEH_THREAD(func, name) \ | |
13 | +{ \ | |
14 | + __try \ | |
15 | + { \ | |
16 | + return func(thread); \ | |
17 | + } __except(SEHdump(GetExceptionInformation()), EXCEPTION_EXECUTE_HANDLER) \ | |
18 | + { \ | |
19 | + } \ | |
20 | +} \ | |
21 | + | |
22 | +void SEHdump(_EXCEPTION_POINTERS *); | |
23 | + | |
24 | +#endif |
@@ -408,225 +408,55 @@ int APIENTRY WinMain(HINSTANCE hInstance, | ||
408 | 408 | int nCmdShow) |
409 | 409 | { |
410 | 410 | // SEH handling |
411 | + _EXCEPTION_POINTERS *lpExcept; | |
411 | 412 | __try |
412 | 413 | { |
413 | -#if 0 | |
414 | -#ifdef _DEBUG | |
415 | - // memory leak check | |
416 | - ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); | |
417 | -#endif | |
418 | - | |
419 | - char tmpURL[8192]; | |
420 | - tmpURL[0]=0; | |
421 | - char *chanURL=NULL; | |
422 | - | |
423 | - hInst = hInstance; | |
424 | - | |
425 | - version_ex = 1; // PP版拡張機能を無効に←大嘘。バージョン表記をEXに | |
426 | - | |
427 | - iniFileName.set(".\\peercast.ini"); | |
428 | - | |
429 | - WIN32_FIND_DATA fd; //JP-EX | |
430 | - HANDLE hFind; //JP-EX | |
431 | - | |
432 | - OSVERSIONINFO osInfo; //JP-EX | |
433 | - osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); //JP-EX | |
434 | - GetVersionEx(&osInfo); | |
435 | - if (osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) | |
436 | - winDistinctionNT = true; | |
437 | - else | |
438 | - winDistinctionNT = false; | |
439 | - | |
440 | - // off by default now | |
441 | - showGUI = false; | |
442 | - | |
443 | - if (strlen(lpCmdLine) > 0) | |
444 | - { | |
445 | - char *p; | |
446 | - if ((p = strstr(lpCmdLine,"-inifile"))!=NULL) | |
447 | - iniFileName.setFromString(p+8); | |
448 | - | |
449 | - if (strstr(lpCmdLine,"-zen")) | |
450 | - showGUI = false; | |
451 | - | |
452 | - if (strstr(lpCmdLine,"-multi")) | |
453 | - allowMulti = true; | |
454 | - | |
455 | - if (strstr(lpCmdLine,"-kill")) | |
456 | - killMe = true; | |
457 | - | |
458 | - if ((p = strstr(lpCmdLine,"-url"))!=NULL) | |
459 | - { | |
460 | - p+=4; | |
461 | - while (*p) | |
462 | - { | |
463 | - if (*p=='"') | |
464 | - { | |
465 | - p++; | |
466 | - break; | |
467 | - } | |
468 | - if (*p != ' ') | |
469 | - break; | |
470 | - p++; | |
471 | - } | |
472 | - if (*p) | |
473 | - strncpy(tmpURL,p,sizeof(tmpURL)-1); | |
474 | - } | |
475 | - } | |
476 | - | |
477 | - // get current path | |
478 | - { | |
479 | - exePath = iniFileName; | |
480 | - char *s = exePath.cstr(); | |
481 | - char *end = NULL; | |
482 | - while (*s) | |
483 | - { | |
484 | - if (*s++ == '\\') | |
485 | - end = s; | |
486 | - } | |
487 | - if (end) | |
488 | - *end = 0; | |
489 | - } | |
490 | - | |
491 | - | |
492 | - if (strnicmp(tmpURL,"peercast://",11)==0) | |
493 | - { | |
494 | - if (strnicmp(tmpURL+11,"pls/",4)==0) | |
495 | - chanURL = tmpURL+11+4; | |
496 | - else | |
497 | - chanURL = tmpURL+11; | |
498 | - showGUI = false; | |
499 | - } | |
500 | - | |
501 | - | |
502 | - MSG msg; | |
503 | - HACCEL hAccelTable; | |
504 | - | |
505 | - // Initialize global strings | |
506 | - //LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); | |
507 | - //LoadString(hInstance, IDC_APP_TITLE, szWindowClass, MAX_LOADSTRING); | |
414 | + WinMainDummy(hInstance, hPrevInstance, lpCmdLine, nCmdShow); | |
508 | 415 | |
509 | - strcpy(szTitle,"PeerCast"); | |
510 | - strcpy(szWindowClass,"PeerCast"); | |
511 | - strcpy(szWindowClass2,"Main"); | |
416 | + } __except(lpExcept = GetExceptionInformation(), EXCEPTION_EXECUTE_HANDLER) | |
417 | + { | |
418 | + DWORD nParams; | |
512 | 419 | |
513 | - if (!allowMulti) | |
420 | + fs.openWriteReplace(".\\dump.txt"); | |
421 | + fs.writeLine("Exception Point: WinMain"); | |
422 | + fs.write("Exception: ", 11); | |
423 | + switch (lpExcept->ExceptionRecord->ExceptionCode) | |
514 | 424 | { |
515 | - HANDLE mutex = CreateMutex(NULL,TRUE,szWindowClass); | |
516 | - | |
517 | - if (GetLastError() == ERROR_ALREADY_EXISTS) | |
518 | - { | |
519 | - HWND oldWin = FindWindow(szWindowClass,NULL); | |
520 | - if (oldWin) | |
521 | - { | |
522 | - //SendMessage(oldWin,WM_SHOWGUI,0,0); | |
523 | - if (killMe) | |
524 | - { | |
525 | - SendMessage(oldWin,WM_DESTROY,0,0); | |
526 | - return 0; | |
527 | - } | |
528 | - | |
529 | - if (chanURL) | |
530 | - { | |
531 | - COPYDATASTRUCT copy; | |
532 | - copy.dwData = WM_PLAYCHANNEL; | |
533 | - copy.cbData = strlen(chanURL)+1; // plus null term | |
534 | - copy.lpData = chanURL; | |
535 | - SendMessage(oldWin,WM_COPYDATA,NULL,(LPARAM)©); | |
536 | - }else{ | |
537 | - if (showGUI) | |
538 | - SendMessage(oldWin,WM_SHOWGUI,0,0); | |
539 | - } | |
540 | - } | |
541 | - return 0; | |
542 | - } | |
543 | - } | |
544 | - | |
545 | - if (killMe) | |
546 | - return 0; | |
547 | - | |
548 | - MyRegisterClass(hInstance); | |
549 | - MyRegisterClass2(hInstance); | |
550 | - | |
551 | - // Perform application initialization: | |
552 | - if (!InitInstance (hInstance, nCmdShow)) | |
553 | - return FALSE; | |
554 | - | |
555 | - peercastInst = new MyPeercastInst(); | |
556 | - peercastApp = new MyPeercastApp(); | |
557 | - | |
558 | - peercastInst->init(); | |
559 | - | |
560 | - LOG_DEBUG("Set OS Type: %s",winDistinctionNT?"WinNT":"Win9x"); | |
425 | + case EXCEPTION_ACCESS_VIOLATION: | |
426 | + fs.writeLine("Access violation"); | |
427 | + break; | |
561 | 428 | |
562 | - if (peercastApp->clearTemp()) //JP-EX | |
563 | - { | |
564 | - DeleteFile("play.pls"); | |
565 | - hFind = FindFirstFile("*.asx",&fd); | |
566 | - if (hFind != INVALID_HANDLE_VALUE) | |
567 | - { | |
568 | - do | |
569 | - { | |
570 | - DeleteFile((char *)&fd.cFileName); | |
571 | - } | |
572 | - while (FindNextFile(hFind,&fd)); | |
429 | + case EXCEPTION_FLT_DIVIDE_BY_ZERO: | |
430 | + case EXCEPTION_INT_DIVIDE_BY_ZERO: | |
431 | + fs.writeLine("Divide by zero"); | |
432 | + break; | |
573 | 433 | |
574 | - FindClose(hFind); | |
575 | - } | |
576 | - } | |
434 | + case EXCEPTION_STACK_OVERFLOW: | |
435 | + fs.writeLine("Stack overflow"); | |
436 | + break; | |
577 | 437 | |
578 | - if (chanURL) | |
579 | - { | |
580 | - ChanInfo info; | |
581 | - servMgr->procConnectArgs(chanURL,info); | |
582 | - chanMgr->findAndPlayChannel(info,false); | |
438 | + default: | |
439 | + fs.writeLong(lpExcept->ExceptionRecord->ExceptionCode); | |
440 | + fs.writeLine(""); | |
583 | 441 | } |
584 | 442 | |
585 | - hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SIMPLE); | |
586 | - | |
587 | - // setup menu notifes | |
588 | - int mask = peercastInst->getNotifyMask(); | |
589 | - if (mask & ServMgr::NT_PEERCAST) | |
590 | - CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_PEERCAST,MF_CHECKED|MF_BYCOMMAND); | |
591 | - if (mask & ServMgr::NT_BROADCASTERS) | |
592 | - CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_BROADCASTERS,MF_CHECKED|MF_BYCOMMAND); | |
593 | - if (mask & ServMgr::NT_TRACKINFO) | |
594 | - CheckMenuItem(trayMenu,ID_POPUP_SHOWMESSAGES_TRACKINFO,MF_CHECKED|MF_BYCOMMAND); | |
443 | + fs.writeLineF("Address: %p", lpExcept->ExceptionRecord->ExceptionAddress); | |
595 | 444 | |
596 | - if (servMgr->startWithGui) | |
445 | + fs.writeLine("Additional information:"); | |
446 | + nParams = lpExcept->ExceptionRecord->NumberParameters; | |
447 | + for (unsigned i=0; i<nParams; ++i) | |
597 | 448 | { |
598 | - createGUI((HWND)0); | |
449 | + fs.writeLineF("%d: %lu", i, lpExcept->ExceptionRecord->ExceptionInformation[i]); | |
599 | 450 | } |
451 | + fs.close(); | |
600 | 452 | |
601 | - // Main message loop: | |
602 | - while (GetMessage(&msg, NULL, 0, 0)) | |
603 | - { | |
604 | - if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) | |
605 | - { | |
606 | - TranslateMessage(&msg); | |
607 | - DispatchMessage(&msg); | |
608 | - } | |
609 | - } | |
610 | - | |
611 | - Shell_NotifyIcon(NIM_DELETE, (NOTIFYICONDATA*)&trayIcon); | |
612 | - | |
613 | - peercastInst->saveSettings(); | |
614 | - peercastInst->quit(); | |
615 | - | |
616 | - Gdiplus::GdiplusShutdown(gdiplusToken); | |
617 | 453 | |
618 | - return msg.wParam; | |
619 | -#endif | |
620 | - WinMainDummy(hInstance, hPrevInstance, lpCmdLine, nCmdShow); | |
621 | - | |
622 | - } __except(EXCEPTION_EXECUTE_HANDLER) | |
623 | - { | |
624 | 454 | fs.openWriteReplace(".\\dump.html"); |
625 | 455 | sys->logBuf->dumpHTML(fs); |
626 | 456 | fs.close(); |
627 | 457 | |
628 | 458 | MessageBox(NULL, "一般保護違反の為、プログラムは強制終了されます。\n" |
629 | - "問題解決のためにダンプデータ(dump.html)を提供してください。", "SEH", | |
459 | + "問題解決のためにダンプデータ(dump.html, dump.txt)を提供してください。", "SEH", | |
630 | 460 | MB_OK|MB_ICONWARNING); |
631 | 461 | |
632 | 462 | return GetExceptionCode(); |
@@ -168,6 +168,7 @@ | ||
168 | 168 | BrowseInformation="1" |
169 | 169 | WarningLevel="3" |
170 | 170 | SuppressStartupBanner="true" |
171 | + DebugInformationFormat="3" | |
171 | 172 | /> |
172 | 173 | <Tool |
173 | 174 | Name="VCManagedResourceCompilerTool" |
@@ -187,7 +188,9 @@ | ||
187 | 188 | LinkIncremental="1" |
188 | 189 | SuppressStartupBanner="true" |
189 | 190 | AdditionalLibraryDirectories=""C:\Visual Studio Projects\PeCa-IMAS7651\core\win32\lib\Release"" |
191 | + GenerateDebugInformation="true" | |
190 | 192 | ProgramDatabaseFile=".\Release/PeerCast.pdb" |
193 | + GenerateMapFile="true" | |
191 | 194 | SubSystem="2" |
192 | 195 | RandomizedBaseAddress="1" |
193 | 196 | DataExecutionPrevention="0" |