blob: 3f6bea2e0fd03d0463e74edf1d599b435cbb53ce [file] [log] [blame]
José Fonseca7e329022010-11-19 17:05:18 +00001/**************************************************************************
2 *
José Fonseca946da142011-12-11 14:32:50 +00003 * Copyright 2011 Jose Fonseca
José Fonseca7e329022010-11-19 17:05:18 +00004 * Copyright 2010 VMware, Inc.
5 * All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 * THE SOFTWARE.
24 *
25 **************************************************************************/
26
José Fonseca946da142011-12-11 14:32:50 +000027
José Fonseca71913ee2011-10-30 13:35:33 +000028#include <string.h>
29
José Fonseca5cc28b02011-10-30 13:38:25 +000030#include "cli.hpp"
José Fonsecab122f502011-12-10 18:07:25 +000031#include "cli_pager.hpp"
José Fonseca822d20a2011-08-20 13:49:40 +010032
José Fonseca7e329022010-11-19 17:05:18 +000033#include "trace_parser.hpp"
José Fonseca946da142011-12-11 14:32:50 +000034#include "trace_dump.hpp"
José Fonseca225193d2012-01-26 19:08:32 +000035#include "trace_callset.hpp"
José Fonseca946da142011-12-11 14:32:50 +000036
José Fonseca7e329022010-11-19 17:05:18 +000037
Carl Worthe525e6f2011-10-20 15:22:09 -070038enum ColorOption {
39 COLOR_OPTION_NEVER = 0,
40 COLOR_OPTION_ALWAYS = 1,
41 COLOR_OPTION_AUTO = -1
42};
43
44static ColorOption color = COLOR_OPTION_AUTO;
José Fonseca822d20a2011-08-20 13:49:40 +010045
José Fonseca340f5692011-11-30 07:04:44 +000046static bool verbose = false;
47
José Fonseca225193d2012-01-26 19:08:32 +000048static trace::CallSet calls(trace::FREQUENCY_ALL);
49
José Fonseca3c167fe2011-10-30 14:21:03 +000050static const char *synopsis = "Dump given trace(s) to standard output.";
51
52static void
53usage(void)
Carl Worthbd5e1642011-10-21 20:40:56 -070054{
José Fonseca3c167fe2011-10-30 14:21:03 +000055 std::cout
56 << "usage: apitrace dump [OPTIONS] <trace-file>...\n"
57 << synopsis << "\n"
José Fonseca646a00d2011-10-30 14:07:20 +000058 "\n"
José Fonseca340f5692011-11-30 07:04:44 +000059 " -v, --verbose verbose output\n"
José Fonseca225193d2012-01-26 19:08:32 +000060 " --calls <CALLSET> Only dump specified calls\n"
José Fonseca646a00d2011-10-30 14:07:20 +000061 " --color=<WHEN>\n"
62 " --colour=<WHEN> Colored syntax highlighting\n"
José Fonseca946da142011-12-11 14:32:50 +000063 " WHEN is 'auto', 'always', or 'never'\n"
64 " --no-arg-names Don't dump argument names\n"
José Fonseca0af96702011-12-22 21:35:10 +000065 " --thread-ids Dump thread ids\n"
José Fonseca946da142011-12-11 14:32:50 +000066 ;
José Fonseca822d20a2011-08-20 13:49:40 +010067}
68
José Fonseca3c167fe2011-10-30 14:21:03 +000069static int
José Fonsecaffba5972011-10-30 14:29:28 +000070command(int argc, char *argv[])
José Fonseca7e329022010-11-19 17:05:18 +000071{
José Fonseca946da142011-12-11 14:32:50 +000072 trace::DumpFlags dumpFlags = 0;
José Fonseca0af96702011-12-22 21:35:10 +000073 bool dumpThreadIds = false;
José Fonseca946da142011-12-11 14:32:50 +000074
José Fonseca822d20a2011-08-20 13:49:40 +010075 int i;
76
José Fonseca225193d2012-01-26 19:08:32 +000077 for (i = 0; i < argc;) {
José Fonseca822d20a2011-08-20 13:49:40 +010078 const char *arg = argv[i];
79
80 if (arg[0] != '-') {
81 break;
82 }
83
José Fonseca225193d2012-01-26 19:08:32 +000084 ++i;
85
José Fonseca822d20a2011-08-20 13:49:40 +010086 if (!strcmp(arg, "--")) {
87 break;
José Fonseca646a00d2011-10-30 14:07:20 +000088 } else if (!strcmp(arg, "--help")) {
José Fonseca3c167fe2011-10-30 14:21:03 +000089 usage();
José Fonseca646a00d2011-10-30 14:07:20 +000090 return 0;
José Fonseca340f5692011-11-30 07:04:44 +000091 } else if (strcmp(arg, "-v") == 0 ||
92 strcmp(arg, "--verbose") == 0) {
93 verbose = true;
José Fonseca225193d2012-01-26 19:08:32 +000094 } else if (!strcmp(arg, "--calls")) {
95 calls = trace::CallSet(argv[i++]);
Carl Worthe525e6f2011-10-20 15:22:09 -070096 } else if (!strcmp(arg, "--color=auto") ||
97 !strcmp(arg, "--colour=auto")) {
98 color = COLOR_OPTION_AUTO;
99 } else if (!strcmp(arg, "--color") ||
100 !strcmp(arg, "--colour") ||
101 !strcmp(arg, "--color=always") ||
102 !strcmp(arg, "--colour=always")) {
103 color = COLOR_OPTION_ALWAYS;
104 } else if (!strcmp(arg, "--color=never") ||
105 !strcmp(arg, "--colour=never") ||
106 !strcmp(arg, "--no-color") ||
José Fonseca822d20a2011-08-20 13:49:40 +0100107 !strcmp(arg, "--no-colour")) {
Carl Worthe525e6f2011-10-20 15:22:09 -0700108 color = COLOR_OPTION_NEVER;
José Fonseca946da142011-12-11 14:32:50 +0000109 } else if (!strcmp(arg, "--no-arg-names")) {
110 dumpFlags |= trace::DUMP_FLAG_NO_ARG_NAMES;
José Fonseca0af96702011-12-22 21:35:10 +0000111 } else if (!strcmp(arg, "--thread-ids")) {
112 dumpThreadIds = true;
José Fonseca822d20a2011-08-20 13:49:40 +0100113 } else {
114 std::cerr << "error: unknown option " << arg << "\n";
José Fonseca3c167fe2011-10-30 14:21:03 +0000115 usage();
José Fonseca822d20a2011-08-20 13:49:40 +0100116 return 1;
117 }
118 }
119
Carl Worthe525e6f2011-10-20 15:22:09 -0700120 if (color == COLOR_OPTION_AUTO) {
121#ifdef _WIN32
122 color = COLOR_OPTION_ALWAYS;
123#else
124 color = isatty(1) ? COLOR_OPTION_ALWAYS : COLOR_OPTION_NEVER;
José Fonsecab122f502011-12-10 18:07:25 +0000125 pipepager();
Carl Worthe525e6f2011-10-20 15:22:09 -0700126#endif
127 }
128
José Fonseca946da142011-12-11 14:32:50 +0000129 if (color == COLOR_OPTION_NEVER) {
130 dumpFlags |= trace::DUMP_FLAG_NO_COLOR;
131 }
132
José Fonseca822d20a2011-08-20 13:49:40 +0100133 for (; i < argc; ++i) {
José Fonsecab4a3d142011-10-27 07:43:19 +0100134 trace::Parser p;
José Fonseca610ed332011-06-04 22:55:42 +0100135
136 if (!p.open(argv[i])) {
137 std::cerr << "error: failed to open " << argv[i] << "\n";
138 return 1;
139 }
140
José Fonsecab4a3d142011-10-27 07:43:19 +0100141 trace::Call *call;
José Fonseca610ed332011-06-04 22:55:42 +0100142 while ((call = p.parse_call())) {
José Fonseca225193d2012-01-26 19:08:32 +0000143 if (calls.contains(*call)) {
144 if (verbose ||
145 !(call->flags & trace::CALL_FLAG_VERBOSE)) {
146 if (dumpThreadIds) {
147 std::cout << std::hex << call->thread_id << std::dec << " ";
148 }
149 trace::dump(*call, std::cout, dumpFlags);
José Fonseca0af96702011-12-22 21:35:10 +0000150 }
José Fonseca340f5692011-11-30 07:04:44 +0000151 }
José Fonseca610ed332011-06-04 22:55:42 +0100152 delete call;
José Fonseca19828972010-11-29 20:34:32 +0000153 }
154 }
José Fonseca822d20a2011-08-20 13:49:40 +0100155
José Fonseca19828972010-11-29 20:34:32 +0000156 return 0;
José Fonseca7e329022010-11-19 17:05:18 +0000157}
José Fonseca3c167fe2011-10-30 14:21:03 +0000158
Carl Worth68f7c982011-11-01 13:47:26 -0700159const Command dump_command = {
José Fonseca3c167fe2011-10-30 14:21:03 +0000160 "dump",
161 synopsis,
162 usage,
163 command
164};