93 lines
2.9 KiB
C
93 lines
2.9 KiB
C
/* 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;
|
|
}
|
|
|