routine_tracer_ondemand.cc 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "routine_tracer_ondemand.h"
  2. #include "simulator.h"
  3. #include "thread_manager.h"
  4. #include "thread.h"
  5. #include "syscall_model.h"
  6. #include "hooks_manager.h"
  7. #include <signal.h>
  8. void RoutineTracerOndemand::RtnThread::printStack()
  9. {
  10. Core::State state = Sim()->getThreadManager()->getThreadState(m_thread->getId());
  11. printf("Thread %d (app %d): %s", m_thread->getId(), m_thread->getAppId(), Core::CoreStateString(state));
  12. if (m_thread->getCore())
  13. printf(" on core %d", m_thread->getCore()->getId());
  14. else if (state == Core::STALLED)
  15. printf(" for %s", ThreadManager::stall_type_names[Sim()->getThreadManager()->getThreadStallReason(m_thread->getId())]);
  16. printf("\n");
  17. if (m_thread->getSyscallMdl()->inSyscall())
  18. printf("\tSyscall: %s\n", m_thread->getSyscallMdl()->formatSyscall().c_str());
  19. for(std::deque<IntPtr>::reverse_iterator it = m_stack.rbegin(); it != m_stack.rend(); ++it)
  20. {
  21. printf("\t(%12" PRIxPTR ") %s\n", *it, m_master->getRoutine(*it) ? m_master->getRoutine(*it)->m_name : "(unknown)");
  22. }
  23. printf("\n");
  24. }
  25. RoutineTracerOndemand::RtnMaster::RtnMaster()
  26. {
  27. Sim()->getHooksManager()->registerHook(HookType::HOOK_SIGUSR1, signalHandler, 0);
  28. }
  29. SInt64 RoutineTracerOndemand::RtnMaster::signalHandler(UInt64, UInt64)
  30. {
  31. ScopedLock sl(Sim()->getThreadManager()->getLock());
  32. for(thread_id_t thread_id = 0; thread_id < (thread_id_t)Sim()->getThreadManager()->getNumThreads(); ++thread_id)
  33. {
  34. Thread *thread = Sim()->getThreadManager()->getThreadFromID(thread_id);
  35. RoutineTracerThread *tracer = thread->getRoutineTracer();
  36. RoutineTracerOndemand::RtnThread *ondemand_tracer = dynamic_cast<RoutineTracerOndemand::RtnThread*>(tracer);
  37. LOG_ASSERT_ERROR(ondemand_tracer, "Expected a routine tracer of type RoutineTracerOndemand::RtnThread");
  38. ondemand_tracer->printStack();
  39. }
  40. return 0;
  41. }
  42. void RoutineTracerOndemand::RtnMaster::addRoutine(IntPtr eip, const char *name, const char *imgname, IntPtr offset, int column, int line, const char *filename)
  43. {
  44. ScopedLock sl(m_lock);
  45. if (m_routines.count(eip) == 0)
  46. {
  47. m_routines[eip] = new RoutineTracer::Routine(eip, name, imgname, offset, column, line, filename);
  48. }
  49. }
  50. bool RoutineTracerOndemand::RtnMaster::hasRoutine(IntPtr eip)
  51. {
  52. ScopedLock sl(m_lock);
  53. return m_routines.count(eip) > 0;
  54. }
  55. RoutineTracer::Routine* RoutineTracerOndemand::RtnMaster::getRoutine(IntPtr eip)
  56. {
  57. ScopedLock sl(m_lock);
  58. return m_routines[eip];
  59. }