@@ -334,44 +334,9 @@ void my_write_core(int sig)
334
334
335
335
#include <dbghelp.h>
336
336
#include <tlhelp32.h>
337
-
338
- /*
339
- Stack tracing on Windows is implemented using Debug Helper library(dbghelp.dll)
340
- We do not redistribute dbghelp and the one comes with older OS (up to Windows 2000)
341
- is missing some important functions like functions StackWalk64 or MinidumpWriteDump.
342
- Hence, we have to load functions at runtime using LoadLibrary/GetProcAddress.
343
- */
344
-
345
- typedef DWORD (WINAPI * SymSetOptions_FctType )(DWORD dwOptions );
346
- typedef BOOL (WINAPI * SymGetModuleInfo64_FctType )
347
- (HANDLE ,DWORD64 ,PIMAGEHLP_MODULE64 ) ;
348
- typedef BOOL (WINAPI * SymGetSymFromAddr64_FctType )
349
- (HANDLE ,DWORD64 ,PDWORD64 ,PIMAGEHLP_SYMBOL64 ) ;
350
- typedef BOOL (WINAPI * SymGetLineFromAddr64_FctType )
351
- (HANDLE ,DWORD64 ,PDWORD ,PIMAGEHLP_LINE64 );
352
- typedef BOOL (WINAPI * SymInitialize_FctType )
353
- (HANDLE ,PSTR ,BOOL );
354
- typedef BOOL (WINAPI * StackWalk64_FctType )
355
- (DWORD ,HANDLE ,HANDLE ,LPSTACKFRAME64 ,PVOID ,PREAD_PROCESS_MEMORY_ROUTINE64 ,
356
- PFUNCTION_TABLE_ACCESS_ROUTINE64 ,PGET_MODULE_BASE_ROUTINE64 ,
357
- PTRANSLATE_ADDRESS_ROUTINE64 );
358
- typedef BOOL (WINAPI * MiniDumpWriteDump_FctType )(
359
- IN HANDLE hProcess ,
360
- IN DWORD ProcessId ,
361
- IN HANDLE hFile ,
362
- IN MINIDUMP_TYPE DumpType ,
363
- IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam , OPTIONAL
364
- IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam , OPTIONAL
365
- IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL
366
- );
367
-
368
- static SymSetOptions_FctType pSymSetOptions ;
369
- static SymGetModuleInfo64_FctType pSymGetModuleInfo64 ;
370
- static SymGetSymFromAddr64_FctType pSymGetSymFromAddr64 ;
371
- static SymInitialize_FctType pSymInitialize ;
372
- static StackWalk64_FctType pStackWalk64 ;
373
- static SymGetLineFromAddr64_FctType pSymGetLineFromAddr64 ;
374
- static MiniDumpWriteDump_FctType pMiniDumpWriteDump ;
337
+ #if _MSC_VER
338
+ #pragma comment(lib, "dbghelp")
339
+ #endif
375
340
376
341
static EXCEPTION_POINTERS * exception_ptrs ;
377
342
@@ -382,50 +347,24 @@ void my_init_stacktrace()
382
347
{
383
348
}
384
349
385
- /*
386
- Dynamically load dbghelp functions
387
- */
388
- BOOL init_dbghelp_functions ()
389
- {
390
- static BOOL first_time = TRUE;
391
- static BOOL rc ;
392
- HMODULE hDbghlp ;
393
-
394
- if (first_time )
395
- {
396
- first_time = FALSE;
397
- hDbghlp = LoadLibrary ("dbghelp" );
398
- if (!hDbghlp )
399
- {
400
- rc = FALSE;
401
- return rc ;
402
- }
403
- pSymSetOptions = (SymSetOptions_FctType )
404
- GetProcAddress (hDbghlp ,"SymSetOptions" );
405
- pSymInitialize = (SymInitialize_FctType )
406
- GetProcAddress (hDbghlp ,"SymInitialize" );
407
- pSymGetModuleInfo64 = (SymGetModuleInfo64_FctType )
408
- GetProcAddress (hDbghlp ,"SymGetModuleInfo64" );
409
- pSymGetLineFromAddr64 = (SymGetLineFromAddr64_FctType )
410
- GetProcAddress (hDbghlp ,"SymGetLineFromAddr64" );
411
- pSymGetSymFromAddr64 = (SymGetSymFromAddr64_FctType )
412
- GetProcAddress (hDbghlp ,"SymGetSymFromAddr64" );
413
- pStackWalk64 = (StackWalk64_FctType )
414
- GetProcAddress (hDbghlp ,"StackWalk64" );
415
- pMiniDumpWriteDump = (MiniDumpWriteDump_FctType )
416
- GetProcAddress (hDbghlp ,"MiniDumpWriteDump" );
417
-
418
- rc = (BOOL )(pSymSetOptions && pSymInitialize && pSymGetModuleInfo64
419
- && pSymGetLineFromAddr64 && pSymGetSymFromAddr64 && pStackWalk64 );
420
- }
421
- return rc ;
422
- }
423
350
424
351
void my_set_exception_pointers (EXCEPTION_POINTERS * ep )
425
352
{
426
353
exception_ptrs = ep ;
427
354
}
428
355
356
+ /*
357
+ Appends directory to symbol path.
358
+ */
359
+ static void add_to_symbol_path (char * path , size_t path_buffer_size ,
360
+ char * dir , size_t dir_buffer_size )
361
+ {
362
+ strcat_s (dir , dir_buffer_size , ";" );
363
+ if (!strstr (path , dir ))
364
+ {
365
+ strcat_s (path , path_buffer_size , dir );
366
+ }
367
+ }
429
368
430
369
/*
431
370
Get symbol path - semicolon-separated list of directories to search for debug
@@ -437,8 +376,28 @@ static void get_symbol_path(char *path, size_t size)
437
376
{
438
377
HANDLE hSnap ;
439
378
char * envvar ;
379
+ char * p ;
380
+ #ifndef DBUG_OFF
381
+ static char pdb_debug_dir [MAX_PATH + 7 ];
382
+ #endif
440
383
441
384
path [0 ]= '\0' ;
385
+
386
+ #ifndef DBUG_OFF
387
+ /*
388
+ Add "debug" subdirectory of the application directory, sometimes PDB will
389
+ placed here by installation.
390
+ */
391
+ GetModuleFileName (NULL , pdb_debug_dir , MAX_PATH );
392
+ p = strrchr (pdb_debug_dir , '\\' );
393
+ if (p )
394
+ {
395
+ * p = 0 ;
396
+ strcat_s (pdb_debug_dir , sizeof (pdb_debug_dir ), "\\debug;" );
397
+ add_to_symbol_path (path , size , pdb_debug_dir , sizeof (pdb_debug_dir ));
398
+ }
399
+ #endif
400
+
442
401
/*
443
402
Enumerate all modules, and add their directories to the path.
444
403
Avoid duplicate entries.
@@ -452,37 +411,31 @@ static void get_symbol_path(char *path, size_t size)
452
411
for (ret = Module32First (hSnap , & mod ); ret ; ret = Module32Next (hSnap , & mod ))
453
412
{
454
413
char * module_dir = mod .szExePath ;
455
- char * p = strrchr (module_dir ,'\\' );
414
+ p = strrchr (module_dir ,'\\' );
456
415
if (!p )
457
416
{
458
417
/*
459
418
Path separator was not found. Not known to happen, if ever happens,
460
419
will indicate current directory.
461
420
*/
462
421
module_dir [0 ]= '.' ;
463
- p = module_dir + 1 ;
422
+ module_dir [ 1 ] = '\0' ;
464
423
}
465
- * p ++ = ';' ;
466
- * p = '\0' ;
467
-
468
- if (!strstr (path , module_dir ))
424
+ else
469
425
{
470
- size_t dir_len = strlen (module_dir );
471
- if (size > dir_len )
472
- {
473
- strncat (path , module_dir , size - 1 );
474
- size -= dir_len ;
475
- }
426
+ * p = '\0' ;
476
427
}
428
+ add_to_symbol_path (path , size , module_dir ,sizeof (mod .szExePath ));
477
429
}
478
430
CloseHandle (hSnap );
479
431
}
480
432
433
+
481
434
/* Add _NT_SYMBOL_PATH, if present. */
482
435
envvar = getenv ("_NT_SYMBOL_PATH" );
483
- if (envvar && size )
436
+ if (envvar )
484
437
{
485
- strncat (path , envvar , size - 1 );
438
+ strcat_s (path , size , envvar );
486
439
}
487
440
}
488
441
@@ -506,15 +459,15 @@ void my_print_stacktrace(uchar* unused1, ulong unused2)
506
459
STACKFRAME64 frame = {0 };
507
460
static char symbol_path [MAX_SYMBOL_PATH ];
508
461
509
- if (!exception_ptrs || ! init_dbghelp_functions () )
462
+ if (!exception_ptrs )
510
463
return ;
511
464
512
465
/* Copy context, as stackwalking on original will unwind the stack */
513
466
context = * (exception_ptrs -> ContextRecord );
514
467
/*Initialize symbols.*/
515
- pSymSetOptions (SYMOPT_LOAD_LINES |SYMOPT_NO_PROMPTS |SYMOPT_DEFERRED_LOADS |SYMOPT_DEBUG );
468
+ SymSetOptions (SYMOPT_LOAD_LINES |SYMOPT_NO_PROMPTS |SYMOPT_DEFERRED_LOADS |SYMOPT_DEBUG );
516
469
get_symbol_path (symbol_path , sizeof (symbol_path ));
517
- pSymInitialize (hProcess , symbol_path , TRUE);
470
+ SymInitialize (hProcess , symbol_path , TRUE);
518
471
519
472
/*Prepare stackframe for the first StackWalk64 call*/
520
473
frame .AddrFrame .Mode = frame .AddrPC .Mode = frame .AddrStack .Mode = AddrModeFlat ;
@@ -546,11 +499,11 @@ void my_print_stacktrace(uchar* unused1, ulong unused2)
546
499
BOOL have_symbol = FALSE;
547
500
BOOL have_source = FALSE;
548
501
549
- if (!pStackWalk64 (machine , hProcess , hThread , & frame , & context , 0 , 0 , 0 ,0 ))
502
+ if (!StackWalk64 (machine , hProcess , hThread , & frame , & context , 0 , 0 , 0 ,0 ))
550
503
break ;
551
504
addr = frame .AddrPC .Offset ;
552
505
553
- have_module = pSymGetModuleInfo64 (hProcess ,addr ,& module );
506
+ have_module = SymGetModuleInfo64 (hProcess ,addr ,& module );
554
507
#ifdef _M_IX86
555
508
if (!have_module )
556
509
{
@@ -560,13 +513,13 @@ void my_print_stacktrace(uchar* unused1, ulong unused2)
560
513
happy, pretend passing the old structure.
561
514
*/
562
515
module .SizeOfStruct = MODULE64_SIZE_WINXP ;
563
- have_module = pSymGetModuleInfo64 (hProcess , addr , & module );
516
+ have_module = SymGetModuleInfo64 (hProcess , addr , & module );
564
517
}
565
518
#endif
566
519
567
- have_symbol = pSymGetSymFromAddr64 (hProcess , addr , & function_offset ,
520
+ have_symbol = SymGetSymFromAddr64 (hProcess , addr , & function_offset ,
568
521
& (package .sym ));
569
- have_source = pSymGetLineFromAddr64 (hProcess , addr , & line_offset , & line );
522
+ have_source = SymGetLineFromAddr64 (hProcess , addr , & line_offset , & line );
570
523
571
524
fprintf (stderr , "%p " , addr );
572
525
if (have_module )
@@ -610,7 +563,7 @@ void my_write_core(int unused)
610
563
MINIDUMP_EXCEPTION_INFORMATION info ;
611
564
HANDLE hFile ;
612
565
613
- if (!exception_ptrs || ! init_dbghelp_functions () || ! pMiniDumpWriteDump )
566
+ if (!exception_ptrs )
614
567
return ;
615
568
616
569
info .ExceptionPointers = exception_ptrs ;
@@ -628,7 +581,7 @@ void my_write_core(int unused)
628
581
if (hFile )
629
582
{
630
583
/* Create minidump */
631
- if (pMiniDumpWriteDump (GetCurrentProcess (), GetCurrentProcessId (),
584
+ if (MiniDumpWriteDump (GetCurrentProcess (), GetCurrentProcessId (),
632
585
hFile , MiniDumpNormal , & info , 0 , 0 ))
633
586
{
634
587
fprintf (stderr , "Minidump written to %s\n" ,
0 commit comments