My stub sends an empty reply to qThreadStopInfo and it crashes lldb. (I understand it's an important command to implement, it's just that I decide if I want to implement them as lldb sends them.)
< 20> send packet: $qThreadStopInfo1#00 1 LLDB 0x0000000101579a43 _ZN12lldb_private3Log21PrintfWithFlagsVarArgEjPKcP13__va_list_tag + 1475 2 LLDB 0x0000000101579c4e _ZN12lldb_private3Log6PrintfEPKcz + 366 3 LLDB 0x00000001017e6f39 _ZN22GDBRemoteCommunication16SendPacketNoLockEPKcm + 649 4 LLDB 0x0000000101b02308 _ZN28GDBRemoteCommunicationClient28SendPacketAndWaitForResponseEPKcmR24StringExtractorGDBRemoteb + 200 5 LLDB 0x0000000101b1374d _ZN28GDBRemoteCommunicationClient17GetThreadStopInfoEyR24StringExtractorGDBRemote + 221 6 LLDB 0x000000010181a368 _ZN15ThreadGDBRemote17CalculateStopInfoEv + 184 7 LLDB 0x0000000101aa8815 _ZN12lldb_private6Thread18GetPrivateStopInfoEv + 997 8 LLDB 0x0000000101aa7cec _ZN12lldb_private6Thread11GetStopInfoEv + 892 9 LLDB 0x0000000101abdde0 _ZN12lldb_private10ThreadList10ShouldStopEPNS_5EventE + 1296 10 LLDB 0x0000000101a2a492 _ZN12lldb_private7Process20ShouldBroadcastEventEPNS_5EventE + 418 11 LLDB 0x0000000101a25b6d _ZN12lldb_private7Process18HandlePrivateEventERNSt3__110shared_ptrINS_5EventEEE + 637 12 LLDB 0x0000000101a2931d _ZN12lldb_private7Process13ConnectRemoteEPNS_6StreamEPKc + 893 13 LLDB 0x000000010148b64c _ZN27CommandObjectProcessConnect9DoExecuteERN12lldb_private4ArgsERNS0_19CommandReturnObjectE + 1788 14 LLDB 0x000000010175c4db _ZN12lldb_private19CommandObjectParsed7ExecuteEPKcRNS_19CommandReturnObjectE + 715 15 LLDB 0x00000001017359a4 _ZN12lldb_private18CommandInterpreter13HandleCommandEPKcNS_8LazyBoolERNS_19CommandReturnObjectEPNS_16ExecutionContextEbb + 21492 16 LLDB 0x00000001017637b8 _ZN12lldb_private25CommandObjectRegexCommand9DoExecuteEPKcRNS_19CommandReturnObjectE + 2984 17 LLDB 0x000000010175c875 _ZN12lldb_private16CommandObjectRaw7ExecuteEPKcRNS_19CommandReturnObjectE + 789 18 LLDB 0x00000001017359a4 _ZN12lldb_private18CommandInterpreter13HandleCommandEPKcNS_8LazyBoolERNS_19CommandReturnObjectEPNS_16ExecutionContextEbb + 21492 19 LLDB 0x00000001000c8584 _ZN4lldb20SBCommandInterpreter13HandleCommandEPKcRNS_21SBCommandReturnObjectEb + 292 20 lldb 0x0000000100007b87 _ZN6Driver13HandleIOEventERKN4lldb7SBEventE + 183 21 lldb 0x000000010000af16 _ZN6Driver8MainLoopEv + 11062 22 lldb 0x000000010000b9d3 main + 467 23 lldb 0x0000000100000fd4 start + 52 24 ??? 0x0000000000000001 0x0 + 1 Stack trace when the crash happens: #0 lldb_private::Mutex::Locker::Lock(lldb_private::Mutex&) at /lldb/source/Host/common/Mutex.cpp:152 #1 lldb_private::Mutex::Locker::Locker(lldb_private::Mutex&) at /lldb/source/Host/common/Mutex.cpp:112 #2 lldb_private::Mutex::Locker::Locker(lldb_private::Mutex&) at /lldb/source/Host/common/Mutex.cpp:113 #3 lldb_private::Unwind::GetFrameInfoAtIndex(unsigned int, unsigned long long&, unsigned long long&) at /lldb/include/lldb/Target/Unwind.h:77 #4 lldb_private::StackFrameList::GetFramesUpTo(unsigned int) at /lldb/source/Target/StackFrameList.cpp:304 #5 lldb_private::StackFrameList::GetFrameAtIndex(unsigned int) at /lldb/source/Target/StackFrameList.cpp:521 #6 lldb_private::StackFrameList::SetDefaultFileAndLineToSelectedFrame() at /lldb/source/Target/StackFrameList.cpp:702 #7 lldb_private::Thread::SetDefaultFileAndLineToSelectedFrame() at /lldb/include/lldb/Target/Thread.h:415 #8 lldb_private::ThreadList::SetSelectedThreadByID(unsigned long long, bool) at /lldb/source/Target/ThreadList.cpp:691 #9 lldb::SBProcess::SetSelectedThread(lldb::SBThread const&) at /lldb/source/API/SBProcess.cpp:462 #10 Driver::UpdateSelectedThread() at /lldb/tools/driver/Driver.cpp:865 #11 Driver::HandleProcessEvent(lldb::SBEvent const&) at /lldb/tools/driver/Driver.cpp:1015 #12 Driver::MainLoop() at /lldb/tools/driver/Driver.cpp:1562 #13 main at /lldb/tools/driver/Driver.cpp:1727 #14 start () It happens because m_thread.GetUnwinder () at Target/StackFrameList.cpp:264 (GetFramesUpTo) returns a null unwinder. Entire communication attached, it should be pretty easy to reproduce from that. Félix
<- QStartNoAckMode -> OK <- QThreadSuffixSupported -> <- QListThreadsInStopReply -> <- qHostInfo -> cputype:18;cpusubtype:9;ostype:classic;vendor:fcloutier;endian:big;ptrsize:4 <- vCont? -> vCont;c;s;t <- qVAttachOrWaitSupported -> <- qC -> QC1 <- ? -> S05 <- qRegisterInfo0 -> name:r0;bitsize:32;offset:0;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo1 -> name:r1;bitsize:32;offset:4;encoding:uint;format:decimal;set=General Purpose Registers;alt-name:sp;generic=sp; <- qRegisterInfo2 -> name:r2;bitsize:32;offset:8;encoding:uint;format:decimal;set=General Purpose Registers;alt-name:toc; <- qRegisterInfo3 -> name:r3;bitsize:32;offset:12;encoding:uint;format:decimal;set=General Purpose Registers;generic:arg1; <- qRegisterInfo4 -> name:r4;bitsize:32;offset:16;encoding:uint;format:decimal;set=General Purpose Registers;generic:arg2; <- qRegisterInfo5 -> name:r5;bitsize:32;offset:20;encoding:uint;format:decimal;set=General Purpose Registers;generic:arg3; <- qRegisterInfo6 -> name:r6;bitsize:32;offset:24;encoding:uint;format:decimal;set=General Purpose Registers;generic:arg4; <- qRegisterInfo7 -> name:r7;bitsize:32;offset:28;encoding:uint;format:decimal;set=General Purpose Registers;generic:arg5; <- qRegisterInfo8 -> name:r8;bitsize:32;offset:32;encoding:uint;format:decimal;set=General Purpose Registers;generic:arg6; <- qRegisterInfo9 -> name:r9;bitsize:32;offset:36;encoding:uint;format:decimal;set=General Purpose Registers;generic:arg7; <- qRegisterInfoa -> name:r10;bitsize:32;offset:40;encoding:uint;format:decimal;set=General Purpose Registers;generic:arg8; <- qRegisterInfob -> name:r11;bitsize:32;offset:44;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfoc -> name:r12;bitsize:32;offset:48;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfod -> name:r13;bitsize:32;offset:52;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfoe -> name:r14;bitsize:32;offset:56;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfof -> name:r15;bitsize:32;offset:60;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo10 -> name:r16;bitsize:32;offset:64;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo11 -> name:r17;bitsize:32;offset:68;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo12 -> name:r18;bitsize:32;offset:72;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo13 -> name:r19;bitsize:32;offset:76;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo14 -> name:r20;bitsize:32;offset:80;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo15 -> name:r21;bitsize:32;offset:84;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo16 -> name:r22;bitsize:32;offset:88;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo17 -> name:r23;bitsize:32;offset:92;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo18 -> name:r24;bitsize:32;offset:96;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo19 -> name:r25;bitsize:32;offset:100;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo1a -> name:r26;bitsize:32;offset:104;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo1b -> name:r27;bitsize:32;offset:108;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo1c -> name:r28;bitsize:32;offset:112;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo1d -> name:r29;bitsize:32;offset:116;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo1e -> name:r30;bitsize:32;offset:120;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo1f -> name:r31;bitsize:32;offset:124;encoding:uint;format:decimal;set=General Purpose Registers; <- qRegisterInfo20 -> name:fr0;bitsize:64;offset:128;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo21 -> name:fr1;bitsize:64;offset:136;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo22 -> name:fr2;bitsize:64;offset:144;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo23 -> name:fr3;bitsize:64;offset:152;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo24 -> name:fr4;bitsize:64;offset:160;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo25 -> name:fr5;bitsize:64;offset:168;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo26 -> name:fr6;bitsize:64;offset:176;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo27 -> name:fr7;bitsize:64;offset:184;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo28 -> name:fr8;bitsize:64;offset:192;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo29 -> name:fr9;bitsize:64;offset:200;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo2a -> name:fr10;bitsize:64;offset:208;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo2b -> name:fr11;bitsize:64;offset:216;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo2c -> name:fr12;bitsize:64;offset:224;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo2d -> name:fr13;bitsize:64;offset:232;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo2e -> name:fr14;bitsize:64;offset:240;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo2f -> name:fr15;bitsize:64;offset:248;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo30 -> name:fr16;bitsize:64;offset:256;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo31 -> name:fr17;bitsize:64;offset:264;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo32 -> name:fr18;bitsize:64;offset:272;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo33 -> name:fr19;bitsize:64;offset:280;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo34 -> name:fr20;bitsize:64;offset:288;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo35 -> name:fr21;bitsize:64;offset:296;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo36 -> name:fr22;bitsize:64;offset:304;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo37 -> name:fr23;bitsize:64;offset:312;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo38 -> name:fr24;bitsize:64;offset:320;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo39 -> name:fr25;bitsize:64;offset:328;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo3a -> name:fr26;bitsize:64;offset:336;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo3b -> name:fr27;bitsize:64;offset:344;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo3c -> name:fr28;bitsize:64;offset:352;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo3d -> name:fr29;bitsize:64;offset:360;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo3e -> name:fr30;bitsize:64;offset:368;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo3f -> name:fr31;bitsize:64;offset:376;encoding:ieee754;format:float;set=Floating-Point Registers; <- qRegisterInfo40 -> name:cr0;bitsize:8;offset:384;encoding:uint;format:binary;set=Condition Registers; <- qRegisterInfo41 -> name:cr1;bitsize:8;offset:385;encoding:uint;format:binary;set=Condition Registers; <- qRegisterInfo42 -> name:cr2;bitsize:8;offset:386;encoding:uint;format:binary;set=Condition Registers; <- qRegisterInfo43 -> name:cr3;bitsize:8;offset:387;encoding:uint;format:binary;set=Condition Registers; <- qRegisterInfo44 -> name:cr4;bitsize:8;offset:388;encoding:uint;format:binary;set=Condition Registers; <- qRegisterInfo45 -> name:cr5;bitsize:8;offset:389;encoding:uint;format:binary;set=Condition Registers; <- qRegisterInfo46 -> name:cr6;bitsize:8;offset:390;encoding:uint;format:binary;set=Condition Registers; <- qRegisterInfo47 -> name:cr7;bitsize:8;offset:391;encoding:uint;format:binary;set=Condition Registers; <- qRegisterInfo48 -> name:xer;bitsize:32;offset:392;encoding:uint;format:binary;set=System Registers; <- qRegisterInfo49 -> name:lr;bitsize:32;offset:396;encoding:uint;format:decimal;set=System Registers;generic:ra; <- qRegisterInfo4a -> name:ctr;bitsize:32;offset:400;encoding:uint;format:decimal;set=System Registers; <- qRegisterInfo4b -> E03 <- qProcessInfo -> <- qShlibInfoAddr -> <- mffff0000,200 -> eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee <- meeeeee00,200 -> eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee <- qfThreadInfo -> m1 <- qsThreadInfo -> l <- qfThreadInfo -> m1 <- qsThreadInfo -> l <- qThreadStopInfo1 ->
Le 2013-08-12 à 11:42:52, Greg Clayton <[email protected]> a écrit : > > On Aug 12, 2013, at 12:43 AM, Félix Cloutier <[email protected]> wrote: > >> Well, it didn't take too long to run into issues: >> >> <- qHostInfo >> -> cputype:18;cpusubtype:9;ostype:unknown;vendor:fclout;endian:big;ptrsize:4 >> >> Assertion failed: (byte_order == m_host_arch.GetByteOrder()), function >> GetHostInfo, file >> /Users/felix/Projets/oss/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp, >> line 1235. >> Abort trap: 6 > > This is now fixed with: > > % svn commit > Sending source/Core/ArchSpec.cpp > Transmitting file data . > Committed revision 188189. > >> Is that something no one did because it's gonna be hard and deep-reaching or >> because nobody had a use case for it? > > No one has down PowerPC debugging yet. > >> Also, pretty early (shortly after receiving no information for qProcessInfo >> and qShlibInfoAddr), lldb asks for the 512 bytes located at 0xffff0000. What >> is it trying to accomplish? > > Not sure, enable packet logging with stack traces and you will see who is > trying to read this memory. Add the following line to your ~/.lldbinit file: > > log enable --file /tmp/packets.txt --stack gdb-remote packets > > >> >> That's where I stopped today. I might bug you guys again tomorrow :) >> >> Félix >> >> Le 2013-08-11 à 16:04:40, Félix Cloutier <[email protected]> a écrit : >> >>> Got it, working on that. >>> >>> Does QStartNoAckMode also disable checksums? In every example in the file, >>> checksums are #00 (and indeed lldb sends me packets with that same >>> checksum), but there's no mention of that in the document. >>> >>> Félix >>> >>> Le 2013-08-10 à 14:49:13, "Malea, Daniel" <[email protected]> a écrit : >>> >>>> There is a text file in the doc/ directory that explains the LLDB >>>> enhancements to the GDB remote protocol. >>>> >>>> Good luck, >>>> Dan >>>> >>>> On 2013-08-10, at 5:40 PM, "Félix Cloutier" <[email protected]> wrote: >>>> >>>>> I am developing an emulator program and I would like to implement a >>>>> debugger stub (over TCP) to which I could connect using the remote >>>>> debugging features of lldb to assist me. GDB documents its communication >>>>> protocol, but I'm not a fan of how every concern happens at the same >>>>> level (especially reliability), so I was hoping the LLDB protocol could >>>>> be more modern. >>>>> >>>>> Is there documentation for it? The commands seem to be declared in >>>>> tools/debugserver/source/RNBRemote.h, but I don't expect to implement all >>>>> of it and I'm not sure what's absolutely necessary and what's not so >>>>> necessary, and I'm not sure how packets are formed. >>>>> >>>>> Is this documented anywhere, or is the best way to grab the source and >>>>> check for myself? >>>>> >>>>> Félix >>>>> _______________________________________________ >>>>> lldb-dev mailing list >>>>> [email protected] >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev >>> >> >> _______________________________________________ >> lldb-dev mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev >
_______________________________________________ lldb-dev mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
