PageRenderTime 27ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/mordor/assert.cpp

http://github.com/mozy/mordor
C++ | 71 lines | 62 code | 8 blank | 1 comment | 6 complexity | 7d03c035423b88b56cef325d7fcb9908 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2010 - Mozy, Inc.
  2. #include "assert.h"
  3. #include "version.h"
  4. #ifdef LINUX
  5. #include <fcntl.h>
  6. #elif defined(OSX)
  7. #include <sys/sysctl.h>
  8. #endif
  9. namespace Mordor {
  10. bool Assertion::throwOnAssertion;
  11. bool isDebuggerAttached()
  12. {
  13. #ifdef WINDOWS
  14. return !!IsDebuggerPresent();
  15. #elif defined(LINUX)
  16. bool result = false;
  17. char buffer[1024];
  18. snprintf(buffer, 1024, "/proc/%d/status", getpid());
  19. int fd = open(buffer, O_RDONLY);
  20. if (fd >= 0) {
  21. int rc = read(fd, buffer, 1024);
  22. if (rc > 0) {
  23. const char *tracerPidStr = strstr(buffer, "TracerPid:");
  24. if (tracerPidStr) {
  25. int tracingPid = atoi(tracerPidStr + 13);
  26. if (tracingPid != 0) {
  27. result = true;
  28. }
  29. }
  30. }
  31. close(fd);
  32. }
  33. return result;
  34. #elif defined(OSX)
  35. int mib[4];
  36. kinfo_proc info;
  37. size_t size;
  38. mib[0] = CTL_KERN;
  39. mib[1] = KERN_PROC;
  40. mib[2] = KERN_PROC_PID;
  41. mib[3] = getpid();
  42. size = sizeof(kinfo_proc);
  43. info.kp_proc.p_flag = 0;
  44. sysctl(mib, 4, &info, &size, NULL, 0);
  45. return !!(info.kp_proc.p_flag & P_TRACED);
  46. #else
  47. return false;
  48. #endif
  49. }
  50. void debugBreak()
  51. {
  52. #ifdef WINDOWS
  53. DebugBreak();
  54. #elif defined (GCC)
  55. #ifdef PPC
  56. __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n"
  57. : : : "memory","r0","r3","r4" );
  58. #elif defined(X86) || defined(X86_64)
  59. __asm__("int $3\n" : : );
  60. #endif
  61. #endif
  62. }
  63. }