1 /* Copyright (C) 2007-2011 The Android Open Source Project
2 **
3 ** This software is licensed under the terms of the GNU General Public
4 ** License version 2, as published by the Free Software Foundation, and
5 ** may be copied, distributed, and modified under those terms.
6 **
7 ** This program is distributed in the hope that it will be useful,
8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 ** GNU General Public License for more details.
11 */
12
13 /*
14 * Contains implementation of main routine for ndk-stack utility.
15 */
16
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <errno.h>
21
22 #include "ndk-stack-parser.h"
23
24 /* Usage string. */
25 static const char* _usage_str =
26 "Usage:\n"
27 " ndk-stack -sym <path> [-dump <path>]\n\n"
28 " -sym Contains full path to the root directory for symbols.\n"
29 " -dump Contains full path to the file containing the crash dump.\n"
30 " This is an optional parameter. If ommited, ndk-stack will\n"
31 " read input data from stdin\n"
32 "\n"
33 " See docs/NDK-STACK.html in your NDK installation tree for more details.\n\n";
34
main(int argc,char ** argv,char ** envp)35 int main(int argc, char **argv, char **envp)
36 {
37 const char* dump_file = NULL;
38 const char* sym_path = NULL;
39 int use_stdin = 0;
40
41 /* Parse command line. */
42 {
43 int n;
44 for (n = 1; n < argc; n++) {
45 if (!strcmp(argv[n], "-dump")) {
46 n++;
47 if (n < argc) {
48 dump_file = argv[n];
49 }
50 } else if (!strcmp(argv[n], "-sym")) {
51 n++;
52 if (n < argc) {
53 sym_path = argv[n];
54 }
55 } else {
56 fprintf(stdout, "%s", _usage_str);
57 return -1;
58 }
59 }
60 if (sym_path == NULL) {
61 fprintf(stdout, "%s", _usage_str);
62 return -1;
63 }
64 if (dump_file == NULL) {
65 use_stdin = 1;
66 }
67 }
68
69 /* Create crash dump parser, open dump file, and parse it line by line. */
70 NdkCrashParser* parser = CreateNdkCrashParser(stdout, sym_path);
71 if (parser != NULL) {
72 FILE* handle = use_stdin ? stdin : fopen(dump_file, "r");
73 if (handle != NULL) {
74 char str[2048];
75 while (fgets(str, sizeof(str), handle)) {
76 /* ParseLine requires that there are no \r, or \n symbols in the
77 * string. */
78 str[strcspn(str, "\r\n")] = '\0';
79 ParseLine(parser, str);
80 }
81 fclose(handle);
82 } else {
83 fprintf(stderr, "Unable to open dump file %s: %s\n",
84 dump_file, strerror(errno));
85 }
86 DestroyNdkCrashParser(parser);
87 } else {
88 fprintf(stderr, "Unable to create NDK stack parser: %s\n",
89 strerror(errno));
90 }
91 return 0;
92 }
93
94