SIFT生成時に誤って大量のトレースファイルが生成されてしまっているので、これのデバッグをしてみる。
Region of Interest (ROI) の開始条件判定において、m_in_roiの状態チェックが逆になっていた。具体的には、以下のような問題があった。
// 問題のあったコード if (m_in_roi && roi_inst_count == m_fast_forward_target) { std::cout << "[FRONTEND] Detail Mode Start\n"; FrontendCallbacks<QemuFrontend>::handleMagic (threadid, SIM_CMD_ROI_START, 0, 0); }
ROI開始の条件を!m_in_roiに修正し、ROI開始時にm_in_roiをtrueに設定するようにした。
// 修正後 if (!m_in_roi && roi_inst_count == m_fast_forward_target) { std::cout << "[FRONTEND] Detail Mode Start\n"; FrontendCallbacks<QemuFrontend>::handleMagic (threadid, SIM_CMD_ROI_START, 0, 0); m_in_roi = true; }
ROI終了時にインストルメンテーションモードをSift::ModeStopに設定し、確実にトレース生成を停止するようにした。
if (m_in_roi && roi_inst_count == m_fast_forward_target + m_detailed_target) { std::cout << "[FRONTEND] Detail Mode End\n"; FrontendCallbacks<QemuFrontend>::handleMagic (threadid, SIM_CMD_ROI_END, 0, 0); m_control->setInstrumentationMode(Sift::ModeStop); m_control->endROI(threadid); m_in_roi = false; }