OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 The Native Client Authors. All rights reserved. | 2 * Copyright 2010 The Native Client Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can | 3 * Use of this source code is governed by a BSD-style license that can |
4 * be found in the LICENSE file. | 4 * be found in the LICENSE file. |
5 */ | 5 */ |
6 | 6 |
7 #include <assert.h> | 7 #include <assert.h> |
8 #include <windows.h> | 8 #include <windows.h> |
9 #include <exception> | 9 #include <exception> |
10 #include <stdexcept> | 10 #include <stdexcept> |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 | 302 |
303 return true; | 303 return true; |
304 } | 304 } |
305 | 305 |
306 virtual void* GetContext() { return &context_; } | 306 virtual void* GetContext() { return &context_; } |
307 | 307 |
308 static LONG NTAPI ExceptionCatch(PEXCEPTION_POINTERS ep) { | 308 static LONG NTAPI ExceptionCatch(PEXCEPTION_POINTERS ep) { |
309 uint32_t id = static_cast<uint32_t>(GetCurrentThreadId()); | 309 uint32_t id = static_cast<uint32_t>(GetCurrentThreadId()); |
310 Thread* thread = static_cast<Thread*>(Acquire(id)); | 310 Thread* thread = static_cast<Thread*>(Acquire(id)); |
311 | 311 |
312 // This 2 lineas are a fix for the bug: | |
313 // 366: Linux GDB doesn't work for Chrome | |
314 // http://code.google.com/p/nativeclient/issues/detail?id=366 | |
315 // When debug stub thread opens socket to listen (for RSP debugger), | |
316 // it triggers some component to send DBG_PRINTEXCEPTION(with string | |
317 // "swi_lsp: non-browser app; disable"), then VEH handler goes into wait | |
318 // for debugger to resolve exception. | |
319 // But debugger is not connected, and debug thread is not listening on | |
320 // connection! It get stuck. | |
321 // Ignoring this exception - for now - helps debug stub start on chrome. | |
322 // Now it can listen on RSP connection and can get debugger connected etc. | |
323 if (DBG_PRINTEXCEPTION_C == ep->ExceptionRecord->ExceptionCode) { | |
324 return EXCEPTION_CONTINUE_EXECUTION; | |
325 } | |
326 | |
327 // If we are not tracking this thread, then ignore it | 312 // If we are not tracking this thread, then ignore it |
328 if (NULL == thread) return EXCEPTION_CONTINUE_SEARCH; | 313 if (NULL == thread) return EXCEPTION_CONTINUE_SEARCH; |
329 | 314 |
330 State old_state = thread->state_; | 315 State old_state = thread->state_; |
331 thread->state_ = SIGNALED; | 316 thread->state_ = SIGNALED; |
332 int8_t sig = ExceptionToSignal(ep->ExceptionRecord->ExceptionCode); | 317 int8_t sig = ExceptionToSignal(ep->ExceptionRecord->ExceptionCode); |
333 | 318 |
334 void *ctx = thread->GetContext(); | 319 void *ctx = thread->GetContext(); |
335 | 320 |
336 memcpy(ctx, ep->ContextRecord, sizeof(CONTEXT)); | 321 memcpy(ctx, ep->ContextRecord, sizeof(CONTEXT)); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 | 385 |
401 // Add the new one, at the front of the list | 386 // Add the new one, at the front of the list |
402 s_OldCatch = AddVectoredExceptionHandler(1, Thread::ExceptionCatch); | 387 s_OldCatch = AddVectoredExceptionHandler(1, Thread::ExceptionCatch); |
403 s_CatchFunc = func; | 388 s_CatchFunc = func; |
404 s_CatchCookie = cookie; | 389 s_CatchCookie = cookie; |
405 } | 390 } |
406 | 391 |
407 | 392 |
408 } // End of port namespace | 393 } // End of port namespace |
409 | 394 |
OLD | NEW |