| 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 | 
|---|