OLD | NEW |
1 // Copyright (c) 2014, Google Inc. | 1 // Copyright (c) 2014, Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 const string& microdump_contents, | 79 const string& microdump_contents, |
80 ProcessState* state) { | 80 ProcessState* state) { |
81 SimpleSymbolSupplier supplier(symbols_file); | 81 SimpleSymbolSupplier supplier(symbols_file); |
82 BasicSourceLineResolver resolver; | 82 BasicSourceLineResolver resolver; |
83 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); | 83 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); |
84 MicrodumpProcessor processor(&frame_symbolizer); | 84 MicrodumpProcessor processor(&frame_symbolizer); |
85 | 85 |
86 return processor.Process(microdump_contents, state); | 86 return processor.Process(microdump_contents, state); |
87 } | 87 } |
88 | 88 |
89 void AnalyzeDump(const string& microdump_file_name, ProcessState* state, | 89 void AnalyzeDump(const string& microdump_file_name, bool omit_symbols, |
90 bool omit_symbols) { | 90 int expected_cpu_count, ProcessState* state) { |
91 string symbols_file = omit_symbols ? "" : files_path_ + "symbols/microdump"; | 91 string symbols_file = omit_symbols ? "" : files_path_ + "symbols/microdump"; |
92 string microdump_file_path = files_path_ + microdump_file_name; | 92 string microdump_file_path = files_path_ + microdump_file_name; |
93 string microdump_contents; | 93 string microdump_contents; |
94 ReadFile(microdump_file_path, µdump_contents); | 94 ReadFile(microdump_file_path, µdump_contents); |
95 | 95 |
96 google_breakpad::ProcessResult result = | 96 google_breakpad::ProcessResult result = |
97 ProcessMicrodump(symbols_file, microdump_contents, state); | 97 ProcessMicrodump(symbols_file, microdump_contents, state); |
98 | 98 |
99 ASSERT_EQ(google_breakpad::PROCESS_OK, result); | 99 ASSERT_EQ(google_breakpad::PROCESS_OK, result); |
100 ASSERT_TRUE(state->crashed()); | 100 ASSERT_TRUE(state->crashed()); |
101 ASSERT_EQ(0, state->requesting_thread()); | 101 ASSERT_EQ(0, state->requesting_thread()); |
102 ASSERT_EQ(1U, state->threads()->size()); | 102 ASSERT_EQ(1U, state->threads()->size()); |
103 | 103 |
104 ASSERT_EQ(2, state->system_info()->cpu_count); | 104 ASSERT_EQ(expected_cpu_count, state->system_info()->cpu_count); |
105 ASSERT_EQ("android", state->system_info()->os_short); | 105 ASSERT_EQ("android", state->system_info()->os_short); |
106 ASSERT_EQ("Android", state->system_info()->os); | 106 ASSERT_EQ("Android", state->system_info()->os); |
107 } | 107 } |
108 | 108 |
109 string files_path_; | 109 string files_path_; |
110 }; | 110 }; |
111 | 111 |
112 TEST_F(MicrodumpProcessorTest, TestProcess_Empty) { | 112 TEST_F(MicrodumpProcessorTest, TestProcess_Empty) { |
113 ProcessState state; | 113 ProcessState state; |
114 google_breakpad::ProcessResult result = | 114 google_breakpad::ProcessResult result = |
115 ProcessMicrodump("", "", &state); | 115 ProcessMicrodump("", "", &state); |
116 ASSERT_EQ(google_breakpad::PROCESS_ERROR_MINIDUMP_NOT_FOUND, result); | 116 ASSERT_EQ(google_breakpad::PROCESS_ERROR_MINIDUMP_NOT_FOUND, result); |
117 } | 117 } |
118 | 118 |
119 TEST_F(MicrodumpProcessorTest, TestProcess_Invalid) { | 119 TEST_F(MicrodumpProcessorTest, TestProcess_Invalid) { |
120 ProcessState state; | 120 ProcessState state; |
121 google_breakpad::ProcessResult result = | 121 google_breakpad::ProcessResult result = |
122 ProcessMicrodump("", "This is not a valid microdump", &state); | 122 ProcessMicrodump("", "This is not a valid microdump", &state); |
123 ASSERT_EQ(google_breakpad::PROCESS_ERROR_NO_THREAD_LIST, result); | 123 ASSERT_EQ(google_breakpad::PROCESS_ERROR_NO_THREAD_LIST, result); |
124 } | 124 } |
125 | 125 |
126 TEST_F(MicrodumpProcessorTest, TestProcess_MissingSymbols) { | 126 TEST_F(MicrodumpProcessorTest, TestProcess_MissingSymbols) { |
127 ProcessState state; | 127 ProcessState state; |
128 AnalyzeDump("microdump-arm64.dmp", &state, true /* omit_symbols */); | 128 AnalyzeDump("microdump-arm64.dmp", true /* omit_symbols */, |
| 129 2 /* expected_cpu_count */, &state); |
129 | 130 |
130 ASSERT_EQ(8U, state.modules()->module_count()); | 131 ASSERT_EQ(8U, state.modules()->module_count()); |
131 ASSERT_EQ("arm64", state.system_info()->cpu); | 132 ASSERT_EQ("arm64", state.system_info()->cpu); |
132 ASSERT_EQ("OS 64 VERSION INFO", state.system_info()->os_version); | 133 ASSERT_EQ("OS 64 VERSION INFO", state.system_info()->os_version); |
133 ASSERT_EQ(1U, state.threads()->size()); | 134 ASSERT_EQ(1U, state.threads()->size()); |
134 ASSERT_EQ(12U, state.threads()->at(0)->frames()->size()); | 135 ASSERT_EQ(12U, state.threads()->at(0)->frames()->size()); |
135 | 136 |
136 ASSERT_EQ("", | 137 ASSERT_EQ("", |
137 state.threads()->at(0)->frames()->at(0)->function_name); | 138 state.threads()->at(0)->frames()->at(0)->function_name); |
138 ASSERT_EQ("", | 139 ASSERT_EQ("", |
139 state.threads()->at(0)->frames()->at(3)->function_name); | 140 state.threads()->at(0)->frames()->at(3)->function_name); |
140 } | 141 } |
141 | 142 |
142 TEST_F(MicrodumpProcessorTest, TestProcess_UnsupportedArch) { | 143 TEST_F(MicrodumpProcessorTest, TestProcess_UnsupportedArch) { |
143 string microdump_contents = | 144 string microdump_contents = |
144 "W/google-breakpad(26491): -----BEGIN BREAKPAD MICRODUMP-----\n" | 145 "W/google-breakpad(26491): -----BEGIN BREAKPAD MICRODUMP-----\n" |
145 "W/google-breakpad(26491): O A \"unsupported-arch\"\n" | 146 "W/google-breakpad(26491): O A \"unsupported-arch\"\n" |
146 "W/google-breakpad(26491): S 0 A48BD840 A48BD000 00002000\n"; | 147 "W/google-breakpad(26491): S 0 A48BD840 A48BD000 00002000\n"; |
147 | 148 |
148 ProcessState state; | 149 ProcessState state; |
149 | 150 |
150 google_breakpad::ProcessResult result = | 151 google_breakpad::ProcessResult result = |
151 ProcessMicrodump("", microdump_contents, &state); | 152 ProcessMicrodump("", microdump_contents, &state); |
152 | 153 |
153 ASSERT_EQ(google_breakpad::PROCESS_ERROR_NO_THREAD_LIST, result); | 154 ASSERT_EQ(google_breakpad::PROCESS_ERROR_NO_THREAD_LIST, result); |
154 } | 155 } |
155 | 156 |
156 TEST_F(MicrodumpProcessorTest, TestProcessArm) { | 157 TEST_F(MicrodumpProcessorTest, TestProcessArm) { |
157 ProcessState state; | 158 ProcessState state; |
158 AnalyzeDump("microdump-arm.dmp", &state, false /* omit_symbols */); | 159 AnalyzeDump("microdump-arm.dmp", false /* omit_symbols */, |
| 160 2 /* expected_cpu_count*/, &state); |
159 | 161 |
160 ASSERT_EQ(6U, state.modules()->module_count()); | 162 ASSERT_EQ(6U, state.modules()->module_count()); |
161 ASSERT_EQ("arm", state.system_info()->cpu); | 163 ASSERT_EQ("arm", state.system_info()->cpu); |
162 ASSERT_EQ("OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)", | 164 ASSERT_EQ("OpenGL ES 3.0 V@104.0 AU@ (GIT@Id3510ff6dc)", |
163 state.system_info()->gl_version); | 165 state.system_info()->gl_version); |
164 ASSERT_EQ("Qualcomm", state.system_info()->gl_vendor); | 166 ASSERT_EQ("Qualcomm", state.system_info()->gl_vendor); |
165 ASSERT_EQ("Adreno (TM) 330", state.system_info()->gl_renderer); | 167 ASSERT_EQ("Adreno (TM) 330", state.system_info()->gl_renderer); |
166 ASSERT_EQ("OS VERSION INFO", state.system_info()->os_version); | 168 ASSERT_EQ("OS VERSION INFO", state.system_info()->os_version); |
167 ASSERT_EQ(8U, state.threads()->at(0)->frames()->size()); | 169 ASSERT_EQ(8U, state.threads()->at(0)->frames()->size()); |
168 ASSERT_EQ("MicrodumpWriterTest_Setup_Test::TestBody", | 170 ASSERT_EQ("MicrodumpWriterTest_Setup_Test::TestBody", |
169 state.threads()->at(0)->frames()->at(0)->function_name); | 171 state.threads()->at(0)->frames()->at(0)->function_name); |
170 ASSERT_EQ("testing::Test::Run", | 172 ASSERT_EQ("testing::Test::Run", |
171 state.threads()->at(0)->frames()->at(1)->function_name); | 173 state.threads()->at(0)->frames()->at(1)->function_name); |
172 ASSERT_EQ("main", | 174 ASSERT_EQ("main", |
173 state.threads()->at(0)->frames()->at(6)->function_name); | 175 state.threads()->at(0)->frames()->at(6)->function_name); |
174 ASSERT_EQ("breakpad_unittests", | 176 ASSERT_EQ("breakpad_unittests", |
175 state.threads()->at(0)->frames()->at(6)->module->code_file()); | 177 state.threads()->at(0)->frames()->at(6)->module->code_file()); |
176 } | 178 } |
177 | 179 |
178 TEST_F(MicrodumpProcessorTest, TestProcessArm64) { | 180 TEST_F(MicrodumpProcessorTest, TestProcessArm64) { |
179 ProcessState state; | 181 ProcessState state; |
180 AnalyzeDump("microdump-arm64.dmp", &state, false /* omit_symbols */); | 182 AnalyzeDump("microdump-arm64.dmp", false /* omit_symbols */, |
| 183 2 /* expected_cpu_count*/, &state); |
181 | 184 |
182 ASSERT_EQ(8U, state.modules()->module_count()); | 185 ASSERT_EQ(8U, state.modules()->module_count()); |
183 ASSERT_EQ("arm64", state.system_info()->cpu); | 186 ASSERT_EQ("arm64", state.system_info()->cpu); |
184 ASSERT_EQ("OS 64 VERSION INFO", state.system_info()->os_version); | 187 ASSERT_EQ("OS 64 VERSION INFO", state.system_info()->os_version); |
185 ASSERT_EQ(9U, state.threads()->at(0)->frames()->size()); | 188 ASSERT_EQ(9U, state.threads()->at(0)->frames()->size()); |
186 ASSERT_EQ("MicrodumpWriterTest_Setup_Test::TestBody", | 189 ASSERT_EQ("MicrodumpWriterTest_Setup_Test::TestBody", |
187 state.threads()->at(0)->frames()->at(0)->function_name); | 190 state.threads()->at(0)->frames()->at(0)->function_name); |
188 ASSERT_EQ("testing::Test::Run", | 191 ASSERT_EQ("testing::Test::Run", |
189 state.threads()->at(0)->frames()->at(2)->function_name); | 192 state.threads()->at(0)->frames()->at(2)->function_name); |
190 ASSERT_EQ("main", | 193 ASSERT_EQ("main", |
191 state.threads()->at(0)->frames()->at(7)->function_name); | 194 state.threads()->at(0)->frames()->at(7)->function_name); |
192 ASSERT_EQ("breakpad_unittests", | 195 ASSERT_EQ("breakpad_unittests", |
193 state.threads()->at(0)->frames()->at(7)->module->code_file()); | 196 state.threads()->at(0)->frames()->at(7)->module->code_file()); |
194 } | 197 } |
195 | 198 |
| 199 TEST_F(MicrodumpProcessorTest, TestProcessX86) { |
| 200 ProcessState state; |
| 201 AnalyzeDump("microdump-x86.dmp", false /* omit_symbols */, |
| 202 4 /* expected_cpu_count */, &state); |
| 203 |
| 204 ASSERT_EQ(105U, state.modules()->module_count()); |
| 205 ASSERT_EQ("x86", state.system_info()->cpu); |
| 206 ASSERT_EQ("asus/WW_Z00A/Z00A:5.0/LRX21V/2.19.40.22_20150627_5104_user:user/" |
| 207 "release-keys", state.system_info()->os_version); |
| 208 ASSERT_EQ(56U, state.threads()->at(0)->frames()->size()); |
| 209 ASSERT_EQ("libc.so", |
| 210 state.threads()->at(0)->frames()->at(0)->module->debug_file()); |
| 211 // TODO(mmandlis): Get symbols for the test X86 microdump and test function |
| 212 // names. |
| 213 } |
| 214 |
196 } // namespace | 215 } // namespace |
197 | 216 |
198 int main(int argc, char* argv[]) { | 217 int main(int argc, char* argv[]) { |
199 ::testing::InitGoogleTest(&argc, argv); | 218 ::testing::InitGoogleTest(&argc, argv); |
200 return RUN_ALL_TESTS(); | 219 return RUN_ALL_TESTS(); |
201 } | 220 } |
OLD | NEW |