/* Copyright (C) 2007-2011 The Android Open Source Project ** ** This software is licensed under the terms of the GNU General Public ** License version 2, as published by the Free Software Foundation, and ** may be copied, distributed, and modified under those terms. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. */ /* * Contains implementation of main routine for ndk-stack utility. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include "ndk-stack-parser.h" /* Usage string. */ static const char* _usage_str = "Usage:\n" " ndk-stack -sym <path> [-dump <path>]\n\n" " -sym Contains full path to the root directory for symbols.\n" " -dump Contains full path to the file containing the crash dump.\n" " This is an optional parameter. If ommited, ndk-stack will\n" " read input data from stdin\n" "\n" " See docs/NDK-STACK.html in your NDK installation tree for more details.\n\n"; int main(int argc, char **argv, char **envp) { const char* dump_file = NULL; const char* sym_path = NULL; int use_stdin = 0; /* Parse command line. */ { int n; for (n = 1; n < argc; n++) { if (!strcmp(argv[n], "-dump")) { n++; if (n < argc) { dump_file = argv[n]; } } else if (!strcmp(argv[n], "-sym")) { n++; if (n < argc) { sym_path = argv[n]; } } else { fprintf(stdout, "%s", _usage_str); return -1; } } if (sym_path == NULL) { fprintf(stdout, "%s", _usage_str); return -1; } if (dump_file == NULL) { use_stdin = 1; } } /* Create crash dump parser, open dump file, and parse it line by line. */ NdkCrashParser* parser = CreateNdkCrashParser(stdout, sym_path); if (parser != NULL) { FILE* handle = use_stdin ? stdin : fopen(dump_file, "r"); if (handle != NULL) { char str[2048]; while (fgets(str, sizeof(str), handle)) { /* ParseLine requires that there are no \r, or \n symbols in the * string. */ str[strcspn(str, "\r\n")] = '\0'; ParseLine(parser, str); } fclose(handle); } else { fprintf(stderr, "Unable to open dump file %s: %s\n", dump_file, strerror(errno)); } DestroyNdkCrashParser(parser); } else { fprintf(stderr, "Unable to create NDK stack parser: %s\n", strerror(errno)); } return 0; }