[lldb-dev] lldb crashes on Linux

Greg Clayton gclayton at apple.com
Sat Jul 2 16:32:00 PDT 2011


The patch might make things compile but 2 or the 3 file patches do not address any of the issues you are running into.

Comments below with each file:

On Jul 2, 2011, at 10:40 AM, Tobias Platen wrote:

> Hello,
> I finally managed to compile LLDB on Linux but the programm debugged seems to crash in the first instruction with a SIGSEGV.
> 
> The Output of the compiler is:
> si_code = 128
> lldb: ProcessMonitor.cpp:1123: static ProcessMessage::CrashReason ProcessMonitor::GetCrashReasonForSIGSEGV(const siginfo*): Assertion `false && "unexpected si_code for SIGSEGV"' failed.
> 
> First of all I had to apply a small patch to lldb
> 
> --- source/Expression/ASTDumper.cpp	(revision 134085)
> +++ source/Expression/ASTDumper.cpp	(working copy)
> @@ -406,7 +406,7 @@
>     m_stream.Indent();  m_stream.Printf("isCanonicalUnqualified() : %s\n", SfB(type->isCanonicalUnqualified()));
>     m_stream.Indent();  m_stream.Printf("isIncompleteType() : %s\n", SfB(type->isIncompleteType()));
>     m_stream.Indent();  m_stream.Printf("isObjectType() : %s\n", SfB(type->isObjectType()));

Is an assertion firing off down in llvm/clang code? If so, we should figure that out and fix the root cause. We don't see this on MacOSX. Also, who is trying to dump this? What is the stack backtrace when this gets hit?

> -    m_stream.Indent();  m_stream.Printf("isPODType() : %s\n", SfB(type->isPODType()));
> +    //m_stream.Indent();  m_stream.Printf("isPODType() : %s\n", SfB(type->isPODType()));
>     m_stream.Indent();  m_stream.Printf("isLiteralType() : %s\n", SfB(type->isLiteralType()));
>     m_stream.Indent();  m_stream.Printf("isBuiltinType() : %s\n", SfB(type->isBuiltinType()));
>     m_stream.Indent();  m_stream.Printf("isPlaceholderType() : %s\n", SfB(type->isPlaceholderType()));


I will let the linux folks comment on the patch below, looks ok to me though.

> Index: source/Plugins/Process/Linux/ProcessMonitor.cpp
> ===================================================================
> --- source/Plugins/Process/Linux/ProcessMonitor.cpp	(revision 134085)
> +++ source/Plugins/Process/Linux/ProcessMonitor.cpp	(working copy)
> @@ -31,7 +31,10 @@
> #include "ProcessLinux.h"
> #include "ProcessMonitor.h"
> 
> +//for debugging the debugger
> +#include <iostream>
> 
> +
> using namespace lldb_private;
> 
> //------------------------------------------------------------------------------
> @@ -241,7 +244,7 @@
> 
>     // Set errno to zero so that we can detect a failed peek.
>     errno = 0;
> -    unsigned long data = ptrace(PTRACE_PEEKUSER, pid, m_offset, NULL);
> +    uint32_t data = ptrace(PTRACE_PEEKUSER, pid, m_offset, NULL);
> 
>     if (data == -1UL && errno)
>         m_result = false;
> @@ -1074,8 +1077,10 @@
>             return ProcessMessage::Signal(pid, signo);
>     }
> 
> +	
>     if (signo == SIGSEGV) {
>         lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
> +	std::cerr << "SIGSEGV on Linux at \n";
>         ProcessMessage::CrashReason reason = GetCrashReasonForSIGSEGV(info);
>         return ProcessMessage::Crash(pid, reason, signo, fault_addr);
>     }
> @@ -1114,6 +1119,7 @@
>     switch (info->si_code) 
>     {
>     default:
> +        std::cerr << "si_code" << info->si_code;
>         assert(false && "unexpected si_code for SIGSEGV");
>         break;
>     case SEGV_MAPERR:
> @@ -1285,7 +1291,8 @@
> 
>             assert(status == sizeof(op));
>             op->Execute(monitor);
> -            write(fdset.fd, &op, sizeof(op));
> +            int wr=write(fdset.fd, &op, sizeof(op));
> +	    if(wr<0) return;//FIXME error check
>         }
>     }
> }
> @@ -1298,7 +1305,8 @@
>     Mutex::Locker lock(m_server_mutex);
> 
>     // FIXME: Do proper error checking here.
> -    write(m_client_fd, &op, sizeof(op));
> +    int wr=write(m_client_fd, &op, sizeof(op));
> +    if(wr<0) return;	
> 
> READ_AGAIN:
>     if ((status = read(m_client_fd, &ack, sizeof(ack))) < 0)



You commented out any struct, union or class from ever getting any fields added to them so you will never see anything any aggregate data types when/if you are able to dump variables.

Why did you comment this out? Does it not compile? What is the "BAD style" comment about?


> Index: source/Symbol/ClangASTContext.cpp
> ===================================================================
> --- source/Symbol/ClangASTContext.cpp	(revision 134085)
> +++ source/Symbol/ClangASTContext.cpp	(working copy)
> @@ -6,7 +6,6 @@
> // License. See LICENSE.TXT for details.
> //
> //===----------------------------------------------------------------------===//
> -
> #include "lldb/Symbol/ClangASTContext.h"
> 
> // C Includes
> @@ -1591,6 +1590,7 @@
>                 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
>                 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
>             }
> +	#if 0	//BAD style
>             FieldDecl *field = FieldDecl::Create (*ast,
>                                                   record_decl,
>                                                   SourceLocation(),
> @@ -1607,6 +1607,8 @@
>             {
>                 record_decl->addDecl(field);
>             }
> +	#endif
> +		FieldDecl *field = NULL;
>         }
>         else
>         {
> @@ -3123,6 +3125,7 @@
>                     }
>                 }
> 


You have also commented out being able to find any child member by name. Why did you comment this out? Doesn't compile?

> +#if 0
>                 if (cxx_record_decl)
>                 {
>                     const RecordDecl *parent_record_decl = cxx_record_decl;
> @@ -3181,6 +3184,7 @@
>                         return child_indexes.size();
>                     }
>                 }
> +		#endif
> 
>             }
>             break;
> 
> Tobias
> _______________________________________________
> lldb-dev mailing list
> lldb-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev




More information about the lldb-dev mailing list