-thread-info in lldbmi does not conform to protocol. Should end with current thread id

-thread-info in lldbmi does not conform to protocol. Should end with
current thread id as described here:
https://sourceware.org/gdb/onlinedocs/gdb/GDB_002fMI-Thread-Commands.html#GDB_002fMI-Thread-Commands

When printing all threads, the current thread id should be printed
afterwards.

Example:
-thread-info
     ^done,threads=[
     {id="2",target-id="Thread 0xb7e14b90 (LWP 21257)",
        frame={level="0",addr="0xffffe410",func="__kernel_vsyscall",
                args=[]},state="running"},
     {id="1",target-id="Thread 0xb7e156b0 (LWP 21254)",
        frame={level="0",addr="0x0804891f",func="foo",
                args=[{name="i",value="10"}],
                file="/tmp/a.c",fullname="/tmp/a.c",line="158"},
                state="running"}],
     current-thread-id="1"
     (gdb)

Patch from jacdavis@microsoft.com

Reviewers: zturner, chuckr

Differential Revision: http://reviews.llvm.org/differential/revision/edit/18880/

llvm-svn: 265858
This commit is contained in:
Chuck Ries 2016-04-08 22:17:53 +00:00
parent f144b54a91
commit da21e98932
5 changed files with 90 additions and 4 deletions

View File

@ -0,0 +1,7 @@
LEVEL = ../../../make
LDFLAGS=-pthread
CXX_SOURCES := test_threadinfo.cpp
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,39 @@
"""
Test lldb-mi -thread-info command.
"""
from __future__ import print_function
import lldbmi_testcase
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class MiThreadInfoTestCase(lldbmi_testcase.MiTestCaseBase):
mydir = TestBase.compute_mydir(__file__)
@skipIfWindows # pthreads not supported on Windows
@skipIfFreeBSD # llvm.org/pr22411: Failure presumably due to known thread races
def test_lldbmi_thread_info(self):
"""Test that -thread-info prints thread info and the current-thread-id"""
self.spawnLldbMi(args = None)
# Load executable
self.runCmd("-file-exec-and-symbols %s" % self.myexe)
self.expect("\^done")
self.runCmd("-break-insert ThreadProc")
self.expect("\^done")
# Run to the breakpoint
self.runCmd("-exec-run")
self.expect("\^running")
self.expect("\*stopped,reason=\"breakpoint-hit\"")
self.runCmd("-thread-info")
self.expect("\^done,threads=\[\{id=\"1\",(.*)\},\{id=\"2\",(.*)\],current-thread-id=\"2\"")
self.runCmd("-gdb-quit")

View File

@ -0,0 +1,21 @@
#include <cstdlib>
#include <iostream>
#include <thread>
using namespace std;
void
ThreadProc()
{
int i = 0;
i++;
}
int
main()
{
thread t(ThreadProc);
t.join();
return 0;
}

View File

@ -29,9 +29,10 @@
// Throws: None.
//--
CMICmdCmdThreadInfo::CMICmdCmdThreadInfo()
: m_bSingleThread(false)
, m_bThreadInvalid(true)
, m_constStrArgNamedThreadId("thread-id")
: m_bSingleThread(false),
m_bThreadInvalid(true),
m_constStrArgNamedThreadId("thread-id"),
m_bHasCurrentThread(false)
{
// Command factory matches this name with that received from the stdin stream
m_strMiCmd = "thread-info";
@ -124,6 +125,15 @@ CMICmdCmdThreadInfo::Execute()
}
}
// -thread-info with multiple threads ends with the current thread id if any
if (thread.IsValid())
{
const CMIUtilString strId(CMIUtilString::Format("%d", thread.GetIndexID()));
CMICmnMIValueConst miValueCurrThreadId(strId);
m_miValueCurrThreadId = miValueCurrThreadId;
m_bHasCurrentThread = true;
}
return MIstatus::success;
}
@ -179,7 +189,12 @@ CMICmdCmdThreadInfo::Acknowledge()
++it;
}
const CMICmnMIValueResult miValueResult("threads", miValueList);
CMICmnMIValueResult miValueResult("threads", miValueList);
if (m_bHasCurrentThread)
{
CMIUtilString strCurrThreadId = "current-thread-id";
miValueResult.Add(strCurrThreadId, m_miValueCurrThreadId);
}
const CMICmnMIResultRecord miRecordResult(m_cmdData.strMiCmdToken, CMICmnMIResultRecord::eResultClass_Done, miValueResult);
m_miResultRecord = miRecordResult;

View File

@ -60,4 +60,8 @@ class CMICmdCmdThreadInfo : public CMICmdBase
bool m_bThreadInvalid; // True = invalid, false = ok
VecMIValueTuple_t m_vecMIValueTuple;
const CMIUtilString m_constStrArgNamedThreadId;
// mi value of current-thread-id if multiple threads are requested
bool m_bHasCurrentThread;
CMICmnMIValue m_miValueCurrThreadId;
};