| OLD | NEW |
| 1 // Copyright (c) 2013, Google Inc. | 1 // Copyright (c) 2013, 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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 MockCodeModules modules; | 138 MockCodeModules modules; |
| 139 MockSymbolSupplier supplier; | 139 MockSymbolSupplier supplier; |
| 140 BasicSourceLineResolver resolver; | 140 BasicSourceLineResolver resolver; |
| 141 CallStack call_stack; | 141 CallStack call_stack; |
| 142 const vector<StackFrame*>* frames; | 142 const vector<StackFrame*>* frames; |
| 143 }; | 143 }; |
| 144 | 144 |
| 145 class SanityCheck: public StackwalkerMIPSFixture, public Test { }; | 145 class SanityCheck: public StackwalkerMIPSFixture, public Test { }; |
| 146 | 146 |
| 147 TEST_F(SanityCheck, NoResolver) { | 147 TEST_F(SanityCheck, NoResolver) { |
| 148 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 148 stack_section.start() = 0x80000000; | 149 stack_section.start() = 0x80000000; |
| 149 stack_section.D32(0).D32(0x0); | 150 stack_section.D32(0).D32(0x0); |
| 150 RegionFromSection(); | 151 RegionFromSection(); |
| 151 raw_context.epc = 0x00400020; | 152 raw_context.epc = 0x00400020; |
| 152 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; | 153 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; |
| 153 | 154 |
| 154 StackFrameSymbolizer frame_symbolizer(NULL, NULL); | 155 StackFrameSymbolizer frame_symbolizer(NULL, NULL); |
| 155 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, | 156 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, |
| 156 &frame_symbolizer); | 157 &frame_symbolizer); |
| 157 // This should succeed, even without a resolver or supplier. | 158 // This should succeed, even without a resolver or supplier. |
| 158 vector<const CodeModule*> modules_without_symbols; | 159 vector<const CodeModule*> modules_without_symbols; |
| 159 vector<const CodeModule*> modules_with_corrupt_symbols; | 160 vector<const CodeModule*> modules_with_corrupt_symbols; |
| 160 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, | 161 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, |
| 161 &modules_with_corrupt_symbols)); | 162 &modules_with_corrupt_symbols)); |
| 162 ASSERT_EQ(1U, modules_without_symbols.size()); | 163 ASSERT_EQ(1U, modules_without_symbols.size()); |
| 163 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); | 164 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); |
| 164 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); | 165 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); |
| 165 frames = call_stack.frames(); | 166 frames = call_stack.frames(); |
| 166 ASSERT_EQ(1U, frames->size()); | 167 ASSERT_EQ(1U, frames->size()); |
| 167 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); | 168 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); |
| 168 // Check that the values from the original raw context made it | 169 // Check that the values from the original raw context made it |
| 169 // through to the context in the stack frame. | 170 // through to the context in the stack frame. |
| 170 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); | 171 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); |
| 171 } | 172 } |
| 172 | 173 |
| 173 class GetContextFrame: public StackwalkerMIPSFixture, public Test { }; | 174 class GetContextFrame: public StackwalkerMIPSFixture, public Test { }; |
| 174 | 175 |
| 175 TEST_F(GetContextFrame, Simple) { | 176 TEST_F(GetContextFrame, Simple) { |
| 177 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 176 stack_section.start() = 0x80000000; | 178 stack_section.start() = 0x80000000; |
| 177 stack_section.D32(0).D32(0x0); | 179 stack_section.D32(0).D32(0x0); |
| 178 RegionFromSection(); | 180 RegionFromSection(); |
| 179 raw_context.epc = 0x00400020; | 181 raw_context.epc = 0x00400020; |
| 180 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; | 182 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; |
| 181 | 183 |
| 182 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); | 184 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); |
| 183 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, | 185 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, |
| 184 &frame_symbolizer); | 186 &frame_symbolizer); |
| 185 vector<const CodeModule*> modules_without_symbols; | 187 vector<const CodeModule*> modules_without_symbols; |
| 186 vector<const CodeModule*> modules_with_corrupt_symbols; | 188 vector<const CodeModule*> modules_with_corrupt_symbols; |
| 187 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, | 189 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, |
| 188 &modules_with_corrupt_symbols)); | 190 &modules_with_corrupt_symbols)); |
| 189 ASSERT_EQ(1U, modules_without_symbols.size()); | 191 ASSERT_EQ(1U, modules_without_symbols.size()); |
| 190 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); | 192 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); |
| 191 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); | 193 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); |
| 192 frames = call_stack.frames(); | 194 frames = call_stack.frames(); |
| 193 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); | 195 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); |
| 194 // Check that the values from the original raw context made it | 196 // Check that the values from the original raw context made it |
| 195 // through to the context in the stack frame. | 197 // through to the context in the stack frame. |
| 196 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); | 198 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); |
| 197 } | 199 } |
| 198 | 200 |
| 199 // The stackwalker should be able to produce the context frame even | 201 // The stackwalker should be able to produce the context frame even |
| 200 // without stack memory present. | 202 // without stack memory present. |
| 201 TEST_F(GetContextFrame, NoStackMemory) { | 203 TEST_F(GetContextFrame, NoStackMemory) { |
| 204 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 202 raw_context.epc = 0x00400020; | 205 raw_context.epc = 0x00400020; |
| 203 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; | 206 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; |
| 204 | 207 |
| 205 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); | 208 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); |
| 206 StackwalkerMIPS walker(&system_info, &raw_context, NULL, &modules, | 209 StackwalkerMIPS walker(&system_info, &raw_context, NULL, &modules, |
| 207 &frame_symbolizer); | 210 &frame_symbolizer); |
| 208 vector<const CodeModule*> modules_without_symbols; | 211 vector<const CodeModule*> modules_without_symbols; |
| 209 vector<const CodeModule*> modules_with_corrupt_symbols; | 212 vector<const CodeModule*> modules_with_corrupt_symbols; |
| 210 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, | 213 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, |
| 211 &modules_with_corrupt_symbols)); | 214 &modules_with_corrupt_symbols)); |
| 212 ASSERT_EQ(1U, modules_without_symbols.size()); | 215 ASSERT_EQ(1U, modules_without_symbols.size()); |
| 213 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); | 216 ASSERT_EQ("module1", modules_without_symbols[0]->debug_file()); |
| 214 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); | 217 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); |
| 215 frames = call_stack.frames(); | 218 frames = call_stack.frames(); |
| 216 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); | 219 StackFrameMIPS* frame = static_cast<StackFrameMIPS*>(frames->at(0)); |
| 217 // Check that the values from the original raw context made it | 220 // Check that the values from the original raw context made it |
| 218 // through to the context in the stack frame. | 221 // through to the context in the stack frame. |
| 219 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); | 222 EXPECT_EQ(0, memcmp(&raw_context, &frame->context, sizeof(raw_context))); |
| 220 } | 223 } |
| 221 | 224 |
| 222 class GetCallerFrame: public StackwalkerMIPSFixture, public Test { }; | 225 class GetCallerFrame: public StackwalkerMIPSFixture, public Test { }; |
| 223 | 226 |
| 224 TEST_F(GetCallerFrame, ScanWithoutSymbols) { | 227 TEST_F(GetCallerFrame, ScanWithoutSymbols) { |
| 228 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 225 // When the stack walker resorts to scanning the stack, | 229 // When the stack walker resorts to scanning the stack, |
| 226 // only addresses located within loaded modules are | 230 // only addresses located within loaded modules are |
| 227 // considered valid return addresses. | 231 // considered valid return addresses. |
| 228 // Force scanning through three frames to ensure that the | 232 // Force scanning through three frames to ensure that the |
| 229 // stack pointer is set properly in scan-recovered frames. | 233 // stack pointer is set properly in scan-recovered frames. |
| 230 stack_section.start() = 0x80000000; | 234 stack_section.start() = 0x80000000; |
| 231 uint32_t return_address1 = 0x00400100; | 235 uint32_t return_address1 = 0x00400100; |
| 232 uint32_t return_address2 = 0x00400900; | 236 uint32_t return_address2 = 0x00400900; |
| 233 Label frame1_sp, frame2_sp; | 237 Label frame1_sp, frame2_sp; |
| 234 stack_section | 238 stack_section |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | | 295 ASSERT_EQ((StackFrameMIPS::CONTEXT_VALID_PC | |
| 292 StackFrameMIPS::CONTEXT_VALID_SP | | 296 StackFrameMIPS::CONTEXT_VALID_SP | |
| 293 StackFrameMIPS::CONTEXT_VALID_FP | | 297 StackFrameMIPS::CONTEXT_VALID_FP | |
| 294 StackFrameMIPS::CONTEXT_VALID_RA), | 298 StackFrameMIPS::CONTEXT_VALID_RA), |
| 295 frame2->context_validity); | 299 frame2->context_validity); |
| 296 EXPECT_EQ(return_address2 - 2 * sizeof(return_address2), frame2->context.epc); | 300 EXPECT_EQ(return_address2 - 2 * sizeof(return_address2), frame2->context.epc); |
| 297 EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_MIPS_REG_SP]); | 301 EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_MIPS_REG_SP]); |
| 298 } | 302 } |
| 299 | 303 |
| 300 TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { | 304 TEST_F(GetCallerFrame, ScanWithFunctionSymbols) { |
| 305 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 301 // During stack scanning, if a potential return address | 306 // During stack scanning, if a potential return address |
| 302 // is located within a loaded module that has symbols, | 307 // is located within a loaded module that has symbols, |
| 303 // it is only considered a valid return address if it | 308 // it is only considered a valid return address if it |
| 304 // lies within a function's bounds. | 309 // lies within a function's bounds. |
| 305 stack_section.start() = 0x80000000; | 310 stack_section.start() = 0x80000000; |
| 306 uint32_t return_address = 0x00500200; | 311 uint32_t return_address = 0x00500200; |
| 307 Label frame1_sp; | 312 Label frame1_sp; |
| 308 stack_section | 313 stack_section |
| 309 // frame 0 | 314 // frame 0 |
| 310 .Append(16, 0) // space | 315 .Append(16, 0) // space |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 StackFrameMIPS::CONTEXT_VALID_FP | | 364 StackFrameMIPS::CONTEXT_VALID_FP | |
| 360 StackFrameMIPS::CONTEXT_VALID_RA), | 365 StackFrameMIPS::CONTEXT_VALID_RA), |
| 361 frame1->context_validity); | 366 frame1->context_validity); |
| 362 EXPECT_EQ(return_address - 2 * sizeof(return_address), frame1->context.epc); | 367 EXPECT_EQ(return_address - 2 * sizeof(return_address), frame1->context.epc); |
| 363 EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); | 368 EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); |
| 364 EXPECT_EQ("marsupial", frame1->function_name); | 369 EXPECT_EQ("marsupial", frame1->function_name); |
| 365 EXPECT_EQ(0x00500100U, frame1->function_base); | 370 EXPECT_EQ(0x00500100U, frame1->function_base); |
| 366 } | 371 } |
| 367 | 372 |
| 368 TEST_F(GetCallerFrame, CheckStackFrameSizeLimit) { | 373 TEST_F(GetCallerFrame, CheckStackFrameSizeLimit) { |
| 374 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 369 // If the stackwalker resorts to stack scanning, it will scan only | 375 // If the stackwalker resorts to stack scanning, it will scan only |
| 370 // 1024 bytes of stack which correspondes to maximum size of stack frame. | 376 // 1024 bytes of stack which correspondes to maximum size of stack frame. |
| 371 stack_section.start() = 0x80000000; | 377 stack_section.start() = 0x80000000; |
| 372 uint32_t return_address1 = 0x00500100; | 378 uint32_t return_address1 = 0x00500100; |
| 373 uint32_t return_address2 = 0x00500900; | 379 uint32_t return_address2 = 0x00500900; |
| 374 Label frame1_sp, frame2_sp; | 380 Label frame1_sp, frame2_sp; |
| 375 stack_section | 381 stack_section |
| 376 // frame 0 | 382 // frame 0 |
| 377 .Append(32, 0) // space | 383 .Append(32, 0) // space |
| 378 | 384 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 StackFrameMIPS::CONTEXT_VALID_FP | | 436 StackFrameMIPS::CONTEXT_VALID_FP | |
| 431 StackFrameMIPS::CONTEXT_VALID_RA), | 437 StackFrameMIPS::CONTEXT_VALID_RA), |
| 432 frame1->context_validity); | 438 frame1->context_validity); |
| 433 EXPECT_EQ(return_address1 - 2 * sizeof(return_address1), frame1->context.epc); | 439 EXPECT_EQ(return_address1 - 2 * sizeof(return_address1), frame1->context.epc); |
| 434 EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); | 440 EXPECT_EQ(frame1_sp.Value(), frame1->context.iregs[MD_CONTEXT_MIPS_REG_SP]); |
| 435 } | 441 } |
| 436 | 442 |
| 437 // Test that set_max_frames_scanned prevents using stack scanning | 443 // Test that set_max_frames_scanned prevents using stack scanning |
| 438 // to find caller frames. | 444 // to find caller frames. |
| 439 TEST_F(GetCallerFrame, ScanningNotAllowed) { | 445 TEST_F(GetCallerFrame, ScanningNotAllowed) { |
| 446 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 440 // When the stack walker resorts to scanning the stack, | 447 // When the stack walker resorts to scanning the stack, |
| 441 // only fixed number of frames are allowed to be scanned out from stack | 448 // only fixed number of frames are allowed to be scanned out from stack |
| 442 stack_section.start() = 0x80000000; | 449 stack_section.start() = 0x80000000; |
| 443 uint32_t return_address1 = 0x00500100; | 450 uint32_t return_address1 = 0x00500100; |
| 444 uint32_t return_address2 = 0x00500900; | 451 uint32_t return_address2 = 0x00500900; |
| 445 Label frame1_sp, frame2_sp; | 452 Label frame1_sp, frame2_sp; |
| 446 stack_section | 453 stack_section |
| 447 // frame 0 | 454 // frame 0 |
| 448 .Append(32, 0) // space | 455 .Append(32, 0) // space |
| 449 | 456 |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 639 | 646 |
| 640 // The validity mask to impose on the context frame. | 647 // The validity mask to impose on the context frame. |
| 641 int context_frame_validity; | 648 int context_frame_validity; |
| 642 }; | 649 }; |
| 643 | 650 |
| 644 class CFI: public CFIFixture, public Test { }; | 651 class CFI: public CFIFixture, public Test { }; |
| 645 | 652 |
| 646 // TODO(gordanac): add CFI tests | 653 // TODO(gordanac): add CFI tests |
| 647 | 654 |
| 648 TEST_F(CFI, At4004) { | 655 TEST_F(CFI, At4004) { |
| 656 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 649 Label frame1_sp = expected.iregs[MD_CONTEXT_MIPS_REG_SP]; | 657 Label frame1_sp = expected.iregs[MD_CONTEXT_MIPS_REG_SP]; |
| 650 stack_section | 658 stack_section |
| 651 // frame0 | 659 // frame0 |
| 652 .Append(24, 0) // space | 660 .Append(24, 0) // space |
| 653 .D32(frame1_sp) // stack pointer | 661 .D32(frame1_sp) // stack pointer |
| 654 .D32(0x00405510) // return address | 662 .D32(0x00405510) // return address |
| 655 .Mark(&frame1_sp); // This effectively sets stack_section.start(). | 663 .Mark(&frame1_sp); // This effectively sets stack_section.start(). |
| 656 raw_context.epc = 0x00404004; | 664 raw_context.epc = 0x00404004; |
| 657 CheckWalk(); | 665 CheckWalk(); |
| 658 } | 666 } |
| 659 | 667 |
| 660 // Check that we reject rules that would cause the stack pointer to | 668 // Check that we reject rules that would cause the stack pointer to |
| 661 // move in the wrong direction. | 669 // move in the wrong direction. |
| 662 TEST_F(CFI, RejectBackwards) { | 670 TEST_F(CFI, RejectBackwards) { |
| 671 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 663 raw_context.epc = 0x40005000; | 672 raw_context.epc = 0x40005000; |
| 664 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; | 673 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; |
| 665 raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; | 674 raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; |
| 666 | 675 |
| 667 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); | 676 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); |
| 668 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, | 677 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, |
| 669 &frame_symbolizer); | 678 &frame_symbolizer); |
| 670 vector<const CodeModule*> modules_without_symbols; | 679 vector<const CodeModule*> modules_without_symbols; |
| 671 vector<const CodeModule*> modules_with_corrupt_symbols; | 680 vector<const CodeModule*> modules_with_corrupt_symbols; |
| 672 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, | 681 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, |
| 673 &modules_with_corrupt_symbols)); | 682 &modules_with_corrupt_symbols)); |
| 674 ASSERT_EQ(0U, modules_without_symbols.size()); | 683 ASSERT_EQ(0U, modules_without_symbols.size()); |
| 675 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); | 684 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); |
| 676 frames = call_stack.frames(); | 685 frames = call_stack.frames(); |
| 677 ASSERT_EQ(1U, frames->size()); | 686 ASSERT_EQ(1U, frames->size()); |
| 678 } | 687 } |
| 679 | 688 |
| 680 // Check that we reject rules whose expressions' evaluation fails. | 689 // Check that we reject rules whose expressions' evaluation fails. |
| 681 TEST_F(CFI, RejectBadExpressions) { | 690 TEST_F(CFI, RejectBadExpressions) { |
| 691 raw_context.context_flags = raw_context.context_flags | MD_CONTEXT_MIPS_FULL; |
| 682 raw_context.epc = 0x00407000; | 692 raw_context.epc = 0x00407000; |
| 683 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; | 693 raw_context.iregs[MD_CONTEXT_MIPS_REG_SP] = 0x80000000; |
| 684 raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; | 694 raw_context.iregs[MD_CONTEXT_MIPS_REG_RA] = 0x00405510; |
| 685 | 695 |
| 686 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); | 696 StackFrameSymbolizer frame_symbolizer(&supplier, &resolver); |
| 687 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, | 697 StackwalkerMIPS walker(&system_info, &raw_context, &stack_region, &modules, |
| 688 &frame_symbolizer); | 698 &frame_symbolizer); |
| 689 vector<const CodeModule*> modules_without_symbols; | 699 vector<const CodeModule*> modules_without_symbols; |
| 690 vector<const CodeModule*> modules_with_corrupt_symbols; | 700 vector<const CodeModule*> modules_with_corrupt_symbols; |
| 691 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, | 701 ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols, |
| 692 &modules_with_corrupt_symbols)); | 702 &modules_with_corrupt_symbols)); |
| 693 ASSERT_EQ(0U, modules_without_symbols.size()); | 703 ASSERT_EQ(0U, modules_without_symbols.size()); |
| 694 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); | 704 ASSERT_EQ(0U, modules_with_corrupt_symbols.size()); |
| 695 frames = call_stack.frames(); | 705 frames = call_stack.frames(); |
| 696 ASSERT_EQ(1U, frames->size()); | 706 ASSERT_EQ(1U, frames->size()); |
| 697 } | 707 } |
| OLD | NEW |