/**************************************************************************** * apps/system/coredump/coredump.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include #include #include /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * coredump_main ****************************************************************************/ int main(int argc, FAR char *argv[]) { FAR struct lib_stdoutstream_s *outstream; FAR struct lib_hexdumpstream_s *hstream; FAR struct lib_lzfoutstream_s *lstream; char *name = NULL; FAR void *stream; int logmask; int pid = 0; FILE *file; if (argc >= 2) { pid = atoi(argv[1]); if (pid == 0) { name = argv[1]; } if (argc >= 3) { if (name == NULL) { name = argv[2]; } else { pid = atoi(argv[2]); } } } if (pid == 0) { pid = INVALID_PROCESS_ID; } if (name != NULL) { file = fopen(name, "w"); if (file == NULL) { return 1; } } else { file = stdout; } hstream = malloc(sizeof(*hstream) + sizeof(*lstream) + sizeof(*outstream)); if (hstream == NULL) { if (name != NULL) { fclose(file); } return 1; } lstream = (FAR void *)(hstream + 1); outstream = (FAR void *)(lstream + 1); logmask = setlogmask(LOG_ALERT); printf("Start coredump:\n"); /* Initialize hex output stream */ lib_stdoutstream(outstream, file); lib_hexdumpstream(hstream, (FAR void *)outstream); stream = hstream; #ifdef CONFIG_BOARD_COREDUMP_COMPRESSION /* Initialize LZF compression stream */ lib_lzfoutstream(lstream, stream); stream = lstream; #endif /* Do core dump */ core_dump(NULL, stream, pid); #ifdef CONFIG_BOARD_COREDUMP_COMPRESSION printf("Finish coredump (Compression Enabled).\n"); #else printf("Finish coredump.\n"); #endif setlogmask(logmask); free(hstream); if (name != NULL) { fclose(file); } return 0; }