Hi ki.stfu, clayborg, For some time, eclipse (CDT) uses full path of the file in break-insert command when putting breakpoint on a source line. On windows, a typical command looks like the following. 56-break-insert -f F:\\work\\ws\\test\\main.c:49
Current implementation in lldb-mi have problem in 2 ways. It was assuming that there will be only one : in the path which is wrong if full path is supplied. Also CDT sends out path with double backslashes in windows which gives error on resolution. I am replacing \\ with / to handle this issue. Tested on both Windows and Linux using CDT and seems to work. http://reviews.llvm.org/D7379 Files: MICmdCmdBreak.cpp Index: MICmdCmdBreak.cpp =================================================================== --- MICmdCmdBreak.cpp +++ MICmdCmdBreak.cpp @@ -180,19 +180,24 @@ CMIUtilString fileName; MIuint nFileLine = 0; CMIUtilString strFileFn; - const MIint nPosColon = m_brkName.find(cColon); - if (nPosColon != (MIint)std::string::npos) + CMIUtilString rStrLineOrFn; + // Full path in windows can have : after drive letter. So look for the + // last colon + const size_t nPosColon = m_brkName.find_last_of(cColon); + if (nPosColon != std::string::npos) { - CMIUtilString::VecString_t vecFileAndLocation; - const MIuint nSplits = m_brkName.Split(cColon, vecFileAndLocation); - MIunused(nSplits); - if (vecFileAndLocation.size() != 2) + // extract file name and line number from it + fileName = m_brkName.substr(0, nPosColon); + rStrLineOrFn = m_brkName.substr(nPosColon + 1, m_brkName.size() - nPosColon - 1); + + // Replace \\ with / + size_t pos = 0; + while ((pos = fileName.find("\\\\", pos)) != std::string::npos) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_LOCATION_FORMAT), m_cmdData.strMiCmd.c_str(), m_brkName.c_str())); - return MIstatus::failure; + fileName.replace(pos, 2, "/"); + pos += 1; } - fileName = vecFileAndLocation.at(0); - const CMIUtilString &rStrLineOrFn(vecFileAndLocation.at(1)); + if (rStrLineOrFn.empty()) eBrkPtType = eBreakPoint_ByName; else EMAIL PREFERENCES http://reviews.llvm.org/settings/panel/emailpreferences/
Index: MICmdCmdBreak.cpp =================================================================== --- MICmdCmdBreak.cpp +++ MICmdCmdBreak.cpp @@ -180,19 +180,24 @@ CMIUtilString fileName; MIuint nFileLine = 0; CMIUtilString strFileFn; - const MIint nPosColon = m_brkName.find(cColon); - if (nPosColon != (MIint)std::string::npos) + CMIUtilString rStrLineOrFn; + // Full path in windows can have : after drive letter. So look for the + // last colon + const size_t nPosColon = m_brkName.find_last_of(cColon); + if (nPosColon != std::string::npos) { - CMIUtilString::VecString_t vecFileAndLocation; - const MIuint nSplits = m_brkName.Split(cColon, vecFileAndLocation); - MIunused(nSplits); - if (vecFileAndLocation.size() != 2) + // extract file name and line number from it + fileName = m_brkName.substr(0, nPosColon); + rStrLineOrFn = m_brkName.substr(nPosColon + 1, m_brkName.size() - nPosColon - 1); + + // Replace \\ with / + size_t pos = 0; + while ((pos = fileName.find("\\\\", pos)) != std::string::npos) { - SetError(CMIUtilString::Format(MIRSRC(IDS_CMD_ERR_BRKPT_LOCATION_FORMAT), m_cmdData.strMiCmd.c_str(), m_brkName.c_str())); - return MIstatus::failure; + fileName.replace(pos, 2, "/"); + pos += 1; } - fileName = vecFileAndLocation.at(0); - const CMIUtilString &rStrLineOrFn(vecFileAndLocation.at(1)); + if (rStrLineOrFn.empty()) eBrkPtType = eBreakPoint_ByName; else
_______________________________________________ lldb-commits mailing list lldb-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits