OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 void Debug::Iterate(ObjectVisitor* v) { | 889 void Debug::Iterate(ObjectVisitor* v) { |
890 v->VisitPointer(BitCast<Object**>(&(debug_break_return_))); | 890 v->VisitPointer(BitCast<Object**>(&(debug_break_return_))); |
891 v->VisitPointer(BitCast<Object**>(&(debug_break_slot_))); | 891 v->VisitPointer(BitCast<Object**>(&(debug_break_slot_))); |
892 } | 892 } |
893 | 893 |
894 | 894 |
895 void Debug::PutValuesOnStackAndDie(int start, | 895 void Debug::PutValuesOnStackAndDie(int start, |
896 Address c_entry_fp, | 896 Address c_entry_fp, |
897 Address last_fp, | 897 Address last_fp, |
898 Address larger_fp, | 898 Address larger_fp, |
899 Address last_in_fp, | |
900 Address last_out_fp, | |
901 int count, | 899 int count, |
| 900 char* stack, |
902 int end) { | 901 int end) { |
903 OS::PrintError("start: %d\n", start); | 902 OS::PrintError("start: %d\n", start); |
904 OS::PrintError("c_entry_fp: %p\n", static_cast<void*>(c_entry_fp)); | 903 OS::PrintError("c_entry_fp: %p\n", static_cast<void*>(c_entry_fp)); |
905 OS::PrintError("last_fp: %p\n", static_cast<void*>(last_fp)); | 904 OS::PrintError("last_fp: %p\n", static_cast<void*>(last_fp)); |
906 OS::PrintError("larger_fp: %p\n", static_cast<void*>(larger_fp)); | 905 OS::PrintError("larger_fp: %p\n", static_cast<void*>(larger_fp)); |
907 OS::PrintError("last_in_fp: %p\n", static_cast<void*>(last_in_fp)); | |
908 OS::PrintError("last_out_fp: %p\n", static_cast<void*>(last_out_fp)); | |
909 OS::PrintError("count: %d\n", count); | 906 OS::PrintError("count: %d\n", count); |
| 907 if (stack != NULL) { |
| 908 OS::PrintError("stack: %s\n", stack); |
| 909 } |
910 OS::PrintError("end: %d\n", end); | 910 OS::PrintError("end: %d\n", end); |
911 OS::Abort(); | 911 OS::Abort(); |
912 } | 912 } |
913 | 913 |
914 | 914 |
915 Object* Debug::Break(Arguments args) { | 915 Object* Debug::Break(Arguments args) { |
916 Heap* heap = isolate_->heap(); | 916 Heap* heap = isolate_->heap(); |
917 HandleScope scope(isolate_); | 917 HandleScope scope(isolate_); |
918 ASSERT(args.length() == 0); | 918 ASSERT(args.length() == 0); |
919 | 919 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1007 while (!it.done() && it.frame()->fp() < thread_local_.last_fp_) { | 1007 while (!it.done() && it.frame()->fp() < thread_local_.last_fp_) { |
1008 count++; | 1008 count++; |
1009 it.Advance(); | 1009 it.Advance(); |
1010 } | 1010 } |
1011 | 1011 |
1012 // Catch the cases that would lead to crashes and capture | 1012 // Catch the cases that would lead to crashes and capture |
1013 // - C entry FP at which to start stack crawl. | 1013 // - C entry FP at which to start stack crawl. |
1014 // - FP of the frame at which we plan to stop stepping out (last FP). | 1014 // - FP of the frame at which we plan to stop stepping out (last FP). |
1015 // - current FP that's larger than last FP. | 1015 // - current FP that's larger than last FP. |
1016 // - Counter for the number of steps to step out. | 1016 // - Counter for the number of steps to step out. |
| 1017 // - stack trace string. |
1017 if (it.done()) { | 1018 if (it.done()) { |
1018 // We crawled the entire stack, never reaching last_fp_. | 1019 // We crawled the entire stack, never reaching last_fp_. |
1019 PutValuesOnStackAndDie(0xBEEEEEEE, | 1020 PutValuesOnStackAndDie(0xBEEEEEEE, |
1020 frame->fp(), | 1021 frame->fp(), |
1021 thread_local_.last_fp_, | 1022 thread_local_.last_fp_, |
| 1023 reinterpret_cast<Address>(0xDEADDEAD), |
| 1024 count, |
1022 NULL, | 1025 NULL, |
1023 thread_local_.step_into_fp_, | 1026 0xCEEEEEEE); |
1024 thread_local_.step_out_fp_, | |
1025 count, | |
1026 0xFEEEEEEE); | |
1027 } else if (it.frame()->fp() != thread_local_.last_fp_) { | 1027 } else if (it.frame()->fp() != thread_local_.last_fp_) { |
1028 // We crawled over last_fp_, without getting a match. | 1028 // We crawled over last_fp_, without getting a match. |
1029 PutValuesOnStackAndDie(0xBEEEEEEE, | 1029 Handle<String> stack = isolate_->StackTraceString(); |
| 1030 char buffer[2048]; |
| 1031 String::WriteToFlat(*stack, buffer, 0, 2047); |
| 1032 PutValuesOnStackAndDie(0xDEEEEEEE, |
1030 frame->fp(), | 1033 frame->fp(), |
1031 thread_local_.last_fp_, | 1034 thread_local_.last_fp_, |
1032 it.frame()->fp(), | 1035 it.frame()->fp(), |
1033 thread_local_.step_into_fp_, | |
1034 thread_local_.step_out_fp_, | |
1035 count, | 1036 count, |
| 1037 buffer, |
1036 0xFEEEEEEE); | 1038 0xFEEEEEEE); |
1037 } | 1039 } |
1038 | 1040 |
1039 // If we found original frame | 1041 // If we found original frame |
1040 if (it.frame()->fp() == thread_local_.last_fp_) { | 1042 if (it.frame()->fp() == thread_local_.last_fp_) { |
1041 if (step_count > 1) { | 1043 if (step_count > 1) { |
1042 // Save old count and action to continue stepping after | 1044 // Save old count and action to continue stepping after |
1043 // StepOut | 1045 // StepOut |
1044 thread_local_.queued_step_count_ = step_count - 1; | 1046 thread_local_.queued_step_count_ = step_count - 1; |
1045 } | 1047 } |
(...skipping 2656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3702 { | 3704 { |
3703 Locker locker; | 3705 Locker locker; |
3704 Isolate::Current()->debugger()->CallMessageDispatchHandler(); | 3706 Isolate::Current()->debugger()->CallMessageDispatchHandler(); |
3705 } | 3707 } |
3706 } | 3708 } |
3707 } | 3709 } |
3708 | 3710 |
3709 #endif // ENABLE_DEBUGGER_SUPPORT | 3711 #endif // ENABLE_DEBUGGER_SUPPORT |
3710 | 3712 |
3711 } } // namespace v8::internal | 3713 } } // namespace v8::internal |
OLD | NEW |