OLD | NEW |
1 /* Copyright (c) 2008, Google Inc. | 1 /* Copyright (c) 2008, Google Inc. |
2 * All rights reserved. | 2 * All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 30 matching lines...) Expand all Loading... |
41 | 41 |
42 #include <stdio.h> | 42 #include <stdio.h> |
43 #include <stdlib.h> | 43 #include <stdlib.h> |
44 | 44 |
45 #include <windows.h> | 45 #include <windows.h> |
46 #include <dbghelp.h> | 46 #include <dbghelp.h> |
47 | 47 |
48 #define SEARCH_CAP (1024*1024) | 48 #define SEARCH_CAP (1024*1024) |
49 #define WEBSYM "SRV*c:\\websymbols*http://msdl.microsoft.com/download/symbols" | 49 #define WEBSYM "SRV*c:\\websymbols*http://msdl.microsoft.com/download/symbols" |
50 | 50 |
51 void usage() { | |
52 fprintf(stderr, "usage: " | |
53 "addr2line-pdb [-f|--functions] [-C|--demangle] [-e filename]\n"); | |
54 fprintf(stderr, "(Then list the hex addresses on stdin, one per line)\n"); | |
55 } | |
56 | |
57 int main(int argc, char *argv[]) { | 51 int main(int argc, char *argv[]) { |
58 DWORD error; | 52 DWORD error; |
59 HANDLE process; | 53 HANDLE process; |
60 ULONG64 module_base; | 54 ULONG64 module_base; |
61 int i; | 55 int i; |
62 char* search; | 56 char* search; |
63 char buf[256]; /* Enough to hold one hex address, I trust! */ | 57 char buf[256]; /* Enough to hold one hex address, I trust! */ |
64 int rv = 0; | 58 int rv = 0; |
65 /* We may add SYMOPT_UNDNAME if --demangle is specified: */ | 59 /* We may add SYMOPT_UNDNAME if --demangle is specified: */ |
66 DWORD symopts = SYMOPT_DEFERRED_LOADS | SYMOPT_DEBUG | SYMOPT_LOAD_LINES; | 60 DWORD symopts = SYMOPT_DEFERRED_LOADS | SYMOPT_DEBUG | SYMOPT_LOAD_LINES; |
67 char* filename = "a.out"; /* The default if -e isn't specified */ | 61 char* filename = "a.out"; /* The default if -e isn't specified */ |
68 int print_function_name = 0; /* Set to 1 if -f is specified */ | 62 int print_function_name = 0; /* Set to 1 if -f is specified */ |
69 | 63 |
70 for (i = 1; i < argc; i++) { | 64 for (i = 1; i < argc; i++) { |
71 if (strcmp(argv[i], "--functions") == 0 || strcmp(argv[i], "-f") == 0) { | 65 if (strcmp(argv[i], "--functions") == 0 || strcmp(argv[i], "-f") == 0) { |
72 print_function_name = 1; | 66 print_function_name = 1; |
73 } else if (strcmp(argv[i], "--demangle") == 0 || | 67 } else if (strcmp(argv[i], "--demangle") == 0 || |
74 strcmp(argv[i], "-C") == 0) { | 68 strcmp(argv[i], "-C") == 0) { |
75 symopts |= SYMOPT_UNDNAME; | 69 symopts |= SYMOPT_UNDNAME; |
76 } else if (strcmp(argv[i], "-e") == 0) { | 70 } else if (strcmp(argv[i], "-e") == 0) { |
77 if (i + 1 >= argc) { | 71 if (i + 1 >= argc) { |
78 fprintf(stderr, "FATAL ERROR: -e must be followed by a filename\n"); | 72 fprintf(stderr, "FATAL ERROR: -e must be followed by a filename\n"); |
79 return 1; | 73 return 1; |
80 } | 74 } |
81 filename = argv[i+1]; | 75 filename = argv[i+1]; |
82 i++; /* to skip over filename too */ | 76 i++; /* to skip over filename too */ |
83 } else if (strcmp(argv[i], "--help") == 0) { | |
84 usage(); | |
85 exit(0); | |
86 } else { | 77 } else { |
87 usage(); | 78 fprintf(stderr, "usage: " |
| 79 "addr2line-pdb [-f|--functions] [-C|--demangle] [-e filename]\n"); |
| 80 fprintf(stderr, "(Then list the hex addresses on stdin, one per line)\n"); |
88 exit(1); | 81 exit(1); |
89 } | 82 } |
90 } | 83 } |
91 | 84 |
92 process = GetCurrentProcess(); | 85 process = GetCurrentProcess(); |
93 | 86 |
94 if (!SymInitialize(process, NULL, FALSE)) { | 87 if (!SymInitialize(process, NULL, FALSE)) { |
95 error = GetLastError(); | 88 error = GetLastError(); |
96 fprintf(stderr, "SymInitialize returned error : %d\n", error); | 89 fprintf(stderr, "SymInitialize returned error : %d\n", error); |
97 return 1; | 90 return 1; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 if (SymGetLineFromAddr64(process, (DWORD64)addr, &dummy, &line)) { | 147 if (SymGetLineFromAddr64(process, (DWORD64)addr, &dummy, &line)) { |
155 printf("%s:%d\n", line.FileName, (int)line.LineNumber); | 148 printf("%s:%d\n", line.FileName, (int)line.LineNumber); |
156 } else { | 149 } else { |
157 printf("??:0\n"); | 150 printf("??:0\n"); |
158 } | 151 } |
159 } | 152 } |
160 SymUnloadModule64(process, module_base); | 153 SymUnloadModule64(process, module_base); |
161 SymCleanup(process); | 154 SymCleanup(process); |
162 return rv; | 155 return rv; |
163 } | 156 } |
OLD | NEW |