| OLD | NEW |
| 1 // Copyright 2007-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2008 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 3226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3237 // Post 6 commands, filling the command queue and making it expand. | 3237 // Post 6 commands, filling the command queue and making it expand. |
| 3238 // These calls return immediately, but the commands stay on the queue | 3238 // These calls return immediately, but the commands stay on the queue |
| 3239 // until the execution of source_2. | 3239 // until the execution of source_2. |
| 3240 // Note: AsciiToUtf16 executes before SendCommand, so command is copied | 3240 // Note: AsciiToUtf16 executes before SendCommand, so command is copied |
| 3241 // to buffer before buffer is sent to SendCommand. | 3241 // to buffer before buffer is sent to SendCommand. |
| 3242 v8::Debug::SendCommand(buffer_1, AsciiToUtf16(command_1, buffer_1)); | 3242 v8::Debug::SendCommand(buffer_1, AsciiToUtf16(command_1, buffer_1)); |
| 3243 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_2, buffer_2)); | 3243 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_2, buffer_2)); |
| 3244 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); | 3244 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); |
| 3245 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); | 3245 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); |
| 3246 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); | 3246 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_3, buffer_2)); |
| 3247 v8::Debug::SendCommand(buffer_2, AsciiToUtf16(command_continue, buffer_2)); | |
| 3248 message_queue_barriers.barrier_2.Wait(); | 3247 message_queue_barriers.barrier_2.Wait(); |
| 3249 // Main thread compiles and runs source_2. | 3248 // Main thread compiles and runs source_2. |
| 3250 // Queued commands are executed at the start of compilation of source_2. | 3249 // Queued commands are executed at the start of compilation of source_2. |
| 3251 message_queue_barriers.barrier_3.Wait(); | 3250 message_queue_barriers.barrier_3.Wait(); |
| 3252 // Free the message handler to process all the messages from the queue. | 3251 // Free the message handler to process all the messages from the queue. |
| 3253 for (int i = 0; i < 20 ; ++i) { | 3252 for (int i = 0; i < 20 ; ++i) { |
| 3254 message_queue_barriers.semaphore_1->Signal(); | 3253 message_queue_barriers.semaphore_1->Signal(); |
| 3255 } | 3254 } |
| 3256 // Main thread compiles and runs source_3. | 3255 // Main thread compiles and runs source_3. |
| 3257 // source_3 includes a debugger statement, which causes a break event. | 3256 // source_3 includes a debugger statement, which causes a break event. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 3279 | 3278 |
| 3280 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; | 3279 const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; |
| 3281 const char* source_2 = "e = 17;"; | 3280 const char* source_2 = "e = 17;"; |
| 3282 const char* source_3 = "a = 4; debugger; a = 5; a = 6; a = 7;"; | 3281 const char* source_3 = "a = 4; debugger; a = 5; a = 6; a = 7;"; |
| 3283 | 3282 |
| 3284 // See MessageQueueDebuggerThread::Run for interleaved sequence of | 3283 // See MessageQueueDebuggerThread::Run for interleaved sequence of |
| 3285 // API calls and events in the two threads. | 3284 // API calls and events in the two threads. |
| 3286 CompileRun(source_1); | 3285 CompileRun(source_1); |
| 3287 message_queue_barriers.barrier_1.Wait(); | 3286 message_queue_barriers.barrier_1.Wait(); |
| 3288 message_queue_barriers.barrier_2.Wait(); | 3287 message_queue_barriers.barrier_2.Wait(); |
| 3289 v8::Debug::DebugBreak(); | |
| 3290 CompileRun(source_2); | 3288 CompileRun(source_2); |
| 3291 message_queue_barriers.barrier_3.Wait(); | 3289 message_queue_barriers.barrier_3.Wait(); |
| 3292 CompileRun(source_3); | 3290 CompileRun(source_3); |
| 3293 message_queue_debugger_thread.Join(); | 3291 message_queue_debugger_thread.Join(); |
| 3294 fflush(stdout); | 3292 fflush(stdout); |
| 3295 } | 3293 } |
| 3296 | 3294 |
| 3297 /* Test ThreadedDebugging */ | 3295 /* Test ThreadedDebugging */ |
| 3298 /* This test interrupts a running infinite loop that is | 3296 /* This test interrupts a running infinite loop that is |
| 3299 * occupying the v8 thread by a break command from the | 3297 * occupying the v8 thread by a break command from the |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3457 uint16_t buffer[kBufSize]; | 3455 uint16_t buffer[kBufSize]; |
| 3458 | 3456 |
| 3459 const char* command_1 = "{\"seq\":101," | 3457 const char* command_1 = "{\"seq\":101," |
| 3460 "\"type\":\"request\"," | 3458 "\"type\":\"request\"," |
| 3461 "\"command\":\"setbreakpoint\"," | 3459 "\"command\":\"setbreakpoint\"," |
| 3462 "\"arguments\":{\"type\":\"function\",\"target\":\"cat\",\"line\":3}}"; | 3460 "\"arguments\":{\"type\":\"function\",\"target\":\"cat\",\"line\":3}}"; |
| 3463 const char* command_2 = "{\"seq\":102," | 3461 const char* command_2 = "{\"seq\":102," |
| 3464 "\"type\":\"request\"," | 3462 "\"type\":\"request\"," |
| 3465 "\"command\":\"setbreakpoint\"," | 3463 "\"command\":\"setbreakpoint\"," |
| 3466 "\"arguments\":{\"type\":\"function\",\"target\":\"dog\",\"line\":3}}"; | 3464 "\"arguments\":{\"type\":\"function\",\"target\":\"dog\",\"line\":3}}"; |
| 3467 const char* command_3 = "{\"seq\":103," | 3465 const char* command_3 = "{\"seq\":104," |
| 3468 "\"type\":\"request\"," | |
| 3469 "\"command\":\"continue\"}"; | |
| 3470 const char* command_4 = "{\"seq\":104," | |
| 3471 "\"type\":\"request\"," | 3466 "\"type\":\"request\"," |
| 3472 "\"command\":\"evaluate\"," | 3467 "\"command\":\"evaluate\"," |
| 3473 "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":false}}"; | 3468 "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":false}}"; |
| 3474 const char* command_5 = "{\"seq\":105," | 3469 const char* command_4 = "{\"seq\":105," |
| 3475 "\"type\":\"request\"," | 3470 "\"type\":\"request\"," |
| 3476 "\"command\":\"evaluate\"," | 3471 "\"command\":\"evaluate\"," |
| 3477 "\"arguments\":{\"expression\":\"x\",\"disable_break\":true}}"; | 3472 "\"arguments\":{\"expression\":\"x\",\"disable_break\":true}}"; |
| 3478 const char* command_6 = "{\"seq\":106," | 3473 const char* command_5 = "{\"seq\":106," |
| 3479 "\"type\":\"request\"," | 3474 "\"type\":\"request\"," |
| 3480 "\"command\":\"continue\"}"; | 3475 "\"command\":\"continue\"}"; |
| 3481 const char* command_7 = "{\"seq\":107," | 3476 const char* command_6 = "{\"seq\":107," |
| 3482 "\"type\":\"request\"," | 3477 "\"type\":\"request\"," |
| 3483 "\"command\":\"continue\"}"; | 3478 "\"command\":\"continue\"}"; |
| 3484 const char* command_8 = "{\"seq\":108," | 3479 const char* command_7 = "{\"seq\":108," |
| 3485 "\"type\":\"request\"," | 3480 "\"type\":\"request\"," |
| 3486 "\"command\":\"evaluate\"," | 3481 "\"command\":\"evaluate\"," |
| 3487 "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":true}}"; | 3482 "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":true}}"; |
| 3488 const char* command_9 = "{\"seq\":109," | 3483 const char* command_8 = "{\"seq\":109," |
| 3489 "\"type\":\"request\"," | 3484 "\"type\":\"request\"," |
| 3490 "\"command\":\"continue\"}"; | 3485 "\"command\":\"continue\"}"; |
| 3491 | 3486 |
| 3492 | 3487 |
| 3493 // v8 thread initializes, runs source_1 | 3488 // v8 thread initializes, runs source_1 |
| 3494 breakpoints_barriers->barrier_1.Wait(); | 3489 breakpoints_barriers->barrier_1.Wait(); |
| 3495 // 1:Set breakpoint in cat(). | 3490 // 1:Set breakpoint in cat(). |
| 3496 v8::Debug::DebugBreak(); | |
| 3497 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_1, buffer)); | 3491 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_1, buffer)); |
| 3498 // 2:Set breakpoint in dog() | 3492 // 2:Set breakpoint in dog() |
| 3499 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer)); | 3493 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_2, buffer)); |
| 3500 // 3:Continue | |
| 3501 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_3, buffer)); | |
| 3502 breakpoints_barriers->barrier_2.Wait(); | 3494 breakpoints_barriers->barrier_2.Wait(); |
| 3503 // v8 thread starts compiling source_2. | 3495 // v8 thread starts compiling source_2. |
| 3504 // Automatic break happens, to run queued commands | 3496 // Automatic break happens, to run queued commands |
| 3505 // breakpoints_barriers->semaphore_1->Wait(); | 3497 // breakpoints_barriers->semaphore_1->Wait(); |
| 3506 // Commands 1 through 3 run, thread continues. | 3498 // Commands 1 through 3 run, thread continues. |
| 3507 // v8 thread runs source_2 to breakpoint in cat(). | 3499 // v8 thread runs source_2 to breakpoint in cat(). |
| 3508 // message callback receives break event. | 3500 // message callback receives break event. |
| 3509 breakpoints_barriers->semaphore_1->Wait(); | 3501 breakpoints_barriers->semaphore_1->Wait(); |
| 3510 // 4:Evaluate dog() (which has a breakpoint). | 3502 // 4:Evaluate dog() (which has a breakpoint). |
| 3511 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_4, buffer)); | 3503 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_3, buffer)); |
| 3512 // v8 thread hits breakpoint in dog() | 3504 // v8 thread hits breakpoint in dog() |
| 3513 breakpoints_barriers->semaphore_1->Wait(); // wait for break event | 3505 breakpoints_barriers->semaphore_1->Wait(); // wait for break event |
| 3514 // 5:Evaluate x | 3506 // 5:Evaluate x |
| 3507 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_4, buffer)); |
| 3508 // 6:Continue evaluation of dog() |
| 3515 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_5, buffer)); | 3509 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_5, buffer)); |
| 3516 // 6:Continue evaluation of dog() | |
| 3517 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_6, buffer)); | |
| 3518 // dog() finishes. | 3510 // dog() finishes. |
| 3519 // 7:Continue evaluation of source_2, finish cat(17), hit breakpoint | 3511 // 7:Continue evaluation of source_2, finish cat(17), hit breakpoint |
| 3520 // in cat(19). | 3512 // in cat(19). |
| 3521 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_7, buffer)); | 3513 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_6, buffer)); |
| 3522 // message callback gets break event | 3514 // message callback gets break event |
| 3523 breakpoints_barriers->semaphore_1->Wait(); // wait for break event | 3515 breakpoints_barriers->semaphore_1->Wait(); // wait for break event |
| 3524 // 8: Evaluate dog() with breaks disabled | 3516 // 8: Evaluate dog() with breaks disabled |
| 3517 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_7, buffer)); |
| 3518 // 9: Continue evaluation of source2, reach end. |
| 3525 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_8, buffer)); | 3519 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_8, buffer)); |
| 3526 // 9: Continue evaluation of source2, reach end. | |
| 3527 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_9, buffer)); | |
| 3528 } | 3520 } |
| 3529 | 3521 |
| 3530 BreakpointsDebuggerThread breakpoints_debugger_thread; | 3522 BreakpointsDebuggerThread breakpoints_debugger_thread; |
| 3531 BreakpointsV8Thread breakpoints_v8_thread; | 3523 BreakpointsV8Thread breakpoints_v8_thread; |
| 3532 | 3524 |
| 3533 TEST(RecursiveBreakpoints) { | 3525 TEST(RecursiveBreakpoints) { |
| 3526 i::FLAG_debugger_auto_break = true; |
| 3527 |
| 3534 // Create a V8 environment | 3528 // Create a V8 environment |
| 3535 Barriers stack_allocated_breakpoints_barriers; | 3529 Barriers stack_allocated_breakpoints_barriers; |
| 3536 stack_allocated_breakpoints_barriers.Initialize(); | 3530 stack_allocated_breakpoints_barriers.Initialize(); |
| 3537 breakpoints_barriers = &stack_allocated_breakpoints_barriers; | 3531 breakpoints_barriers = &stack_allocated_breakpoints_barriers; |
| 3538 | 3532 |
| 3539 breakpoints_v8_thread.Start(); | 3533 breakpoints_v8_thread.Start(); |
| 3540 breakpoints_debugger_thread.Start(); | 3534 breakpoints_debugger_thread.Start(); |
| 3541 | 3535 |
| 3542 breakpoints_v8_thread.Join(); | 3536 breakpoints_v8_thread.Join(); |
| 3543 breakpoints_debugger_thread.Join(); | 3537 breakpoints_debugger_thread.Join(); |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3795 | 3789 |
| 3796 int host_dispatch_hit_count = 0; | 3790 int host_dispatch_hit_count = 0; |
| 3797 static void HostDispatchHandlerHitCount(void* dispatch, void *data) { | 3791 static void HostDispatchHandlerHitCount(void* dispatch, void *data) { |
| 3798 host_dispatch_hit_count++; | 3792 host_dispatch_hit_count++; |
| 3799 } | 3793 } |
| 3800 | 3794 |
| 3801 | 3795 |
| 3802 // Test that clearing the debug event listener actually clears all break points | 3796 // Test that clearing the debug event listener actually clears all break points |
| 3803 // and related information. | 3797 // and related information. |
| 3804 TEST(DebuggerHostDispatch) { | 3798 TEST(DebuggerHostDispatch) { |
| 3799 i::FLAG_debugger_auto_break = true; |
| 3800 |
| 3805 v8::HandleScope scope; | 3801 v8::HandleScope scope; |
| 3806 DebugLocalContext env; | 3802 DebugLocalContext env; |
| 3807 | 3803 |
| 3808 const int kBufferSize = 1000; | 3804 const int kBufferSize = 1000; |
| 3809 uint16_t buffer[kBufferSize]; | 3805 uint16_t buffer[kBufferSize]; |
| 3810 const char* command_continue = | 3806 const char* command_continue = |
| 3811 "{\"seq\":106," | 3807 "{\"seq\":0," |
| 3812 "\"type\":\"request\"," | 3808 "\"type\":\"request\"," |
| 3813 "\"command\":\"continue\"}"; | 3809 "\"command\":\"continue\"}"; |
| 3814 | 3810 |
| 3815 // Setup message and host dispatch handlers. | 3811 // Setup message and host dispatch handlers. |
| 3816 v8::Debug::SetMessageHandler(DummyMessageHandler); | 3812 v8::Debug::SetMessageHandler(DummyMessageHandler); |
| 3817 v8::Debug::SetHostDispatchHandler(HostDispatchHandlerHitCount, | 3813 v8::Debug::SetHostDispatchHandler(HostDispatchHandlerHitCount, |
| 3818 NULL); | 3814 NULL); |
| 3819 | 3815 |
| 3820 // Fill a host dispatch and a continue command on the command queue before | 3816 // Fill a host dispatch and a continue command on the command queue before |
| 3821 // generating a debug break. | 3817 // running some code. |
| 3822 v8::Debug::SendHostDispatch(NULL); | 3818 v8::Debug::SendHostDispatch(NULL); |
| 3823 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_continue, buffer)); | 3819 v8::Debug::SendCommand(buffer, AsciiToUtf16(command_continue, buffer)); |
| 3824 CompileRun("debugger"); | 3820 CompileRun("void 0"); |
| 3825 | 3821 |
| 3826 // The host dispatch callback should be called. | 3822 // The host dispatch callback should be called. |
| 3827 CHECK_EQ(1, host_dispatch_hit_count); | 3823 CHECK_EQ(1, host_dispatch_hit_count); |
| 3828 } | 3824 } |
| OLD | NEW |