[llvm-dev] [DebugInfo] DWARF C API

David Blaikie via llvm-dev llvm-dev at lists.llvm.org
Wed Apr 24 18:17:09 PDT 2019


Sounds to me like the DWARFContext might not have a valid
reference/pointer/whatever to the ObjectFile? Is there a chance the
ObjectFile pointer in the DWARFContext is null?

I'd suggest you poke around in a debugger there to check what state
it's in in a good (non-C-wrapped) example and in the C-wrapped example
to compare/contrast.

On Wed, Apr 24, 2019 at 2:54 PM Son Tuan VU <sontuan.vu119 at gmail.com> wrote:
>
> Hi David,
>
> Sorry, I forget to attach the valgrind dump to this. I was not sure if my implementation was ok, so I wanted to ask if I've done something wrong first.
>
>  Process terminating with default action of signal 11 (SIGSEGV)
>  Access not within mapped region at address 0xB
>    at 0x54F4516: llvm::object::COFFObjectFile::moveSectionNext(llvm::object::DataRefImpl&) const (COFFObjectFile.cpp:267)
>     by 0x55A62FB: llvm::object::ObjectFile::isBerkeleyText(llvm::object::DataRefImpl) const (ObjectFile.cpp:80)
>     by 0x5538CF9: llvm::object::RelocationRef::getType() const (ObjectFile.h:543)
>     by 0x55AE53E: llvm::object::resolveARM(llvm::object::RelocationRef, unsigned long, unsigned long) (RelocationResolver.cpp:250)
>     by 0x502802B: llvm::DWARFDataExtractor::getRelocatedValue(unsigned int, unsigned int*, unsigned long*) const (DWARFDataExtractor.cpp:27)
>     by 0x5071C2F: llvm::DWARFUnitHeader::extract(llvm::DWARFContext&, llvm::DWARFDataExtractor const&, unsigned int*, llvm::DWARFSectionKind, llvm::DWARFUnitIndex const*, llvm::DWARFUnitIndex::Entr    y const*) (DWARFUnit.cpp:254)
>     by 0x5070BAD: llvm::DWARFUnitVector::addUnitsImpl(llvm::DWARFContext&, llvm::DWARFObject const&, llvm::DWARFSection const&, llvm::DWARFDebugAbbrev const*, llvm::DWARFSection const*, llvm::DWARF    Section const*, llvm::StringRef, llvm::DWARFSection const&, llvm::DWARFSection const*, llvm::DWARFSection const&, bool, bool, bool, llvm::DWARFSectionKind)::{lambda(unsigned int, llvm::DWARFSectionKind, llvm    ::DWARFSection const*, llvm::DWARFUnitIndex::Entry const*)#1}::operator()(unsigned int, llvm::DWARFSectionKind, llvm::DWARFSection const*, llvm::DWARFUnitIndex::Entry const*) const (DWARFUnit.cpp:82)
>
>     by 0x50751E1: std::_Function_handler<std::unique_ptr<llvm::DWARFUnit, std::default_delete<llvm::DWARFUnit> > (unsigned int, llvm::DWARFSectionKind, llvm::DWARFSection const*, llvm::DWARFUnitInd    ex::Entry const*), llvm::DWARFUnitVector::addUnitsImpl(llvm::DWARFContext&, llvm::DWARFObject const&, llvm::DWARFSection const&, llvm::DWARFDebugAbbrev const*, llvm::DWARFSection const*, llvm::DWARFSection c    onst*, llvm::StringRef, llvm::DWARFSection const&, llvm::DWARFSection const*, llvm::DWARFSection const&, bool, bool, bool, llvm::DWARFSectionKind)::{lambda(unsigned int, llvm::DWARFSectionKind, llvm::DWARFSe    ction const*, llvm::DWARFUnitIndex::Entry const*)#1}>::_M_invoke(std::_Any_data const&, unsigned int, llvm::DWARFSectionKind, llvm::DWARFSection const*, llvm::DWARFUnitIndex::Entry const*) (functional:2057)
>
>     by 0x507656E: std::function<std::unique_ptr<llvm::DWARFUnit, std::default_delete<llvm::DWARFUnit> > (unsigned int, llvm::DWARFSectionKind, llvm::DWARFSection const*, llvm::DWARFUnitIndex::Entry     const*)>::operator()(unsigned int, llvm::DWARFSectionKind, llvm::DWARFSection const*, llvm::DWARFUnitIndex::Entry const*) const (functional:2471)
>
>     by 0x5070FE6: llvm::DWARFUnitVector::addUnitsImpl(llvm::DWARFContext&, llvm::DWARFObject const&, llvm::DWARFSection const&, llvm::DWARFDebugAbbrev const*, llvm::DWARFSection const*, llvm::DWARF    Section const*, llvm::StringRef, llvm::DWARFSection const&, llvm::DWARFSection const*, llvm::DWARFSection const&, bool, bool, bool, llvm::DWARFSectionKind) (DWARFUnit.cpp:111)
>
>     by 0x50708CF: llvm::DWARFUnitVector::addUnitsForSection(llvm::DWARFContext&, llvm::DWARFSection const&, llvm::DWARFSectionKind) (DWARFUnit.cpp:44)
>     by 0x5000AAE: llvm::DWARFContext::parseNormalUnits()::{lambda(llvm::DWARFSection const&)#1}::operator()(llvm::DWARFSection const&) const (DWARFContext.cpp:881)
>
> However, I can't see how this error can relate to the wrapping/unwrapping macros generating C structure?
>
> Thanks a lot for your time
>
> Son Tuan Vu
>
>
> On Wed, Apr 24, 2019 at 11:03 PM David Blaikie <dblaikie at gmail.com> wrote:
>>
>> Might be worth running under valgrind or the LLVM sanitizers? (could
>> help diagnose what's going wrong more specifically than a segfault)
>>
>> On Wed, Apr 24, 2019 at 1:57 PM Son Tuan VU via llvm-dev
>> <llvm-dev at lists.llvm.org> wrote:
>> >
>> > Hi folks,
>> >
>> > I am trying to implement the C bindings API for DebugInfo::DWARF::DWARFDie. My goal is to have a C library that reads and parses DWARF debugging format (just like how llvm-dwarfdump does, but maybe more than just dumping debug info)
>> >
>> > I've started with creating C structure for DebugInfo::DWARF::DWARFContext which contains all DWARF DIEs in the object file. For this I used
>> > ```
>> > DEFINE_SIMPLE_CONVERSION_FUNCTIONS(DWARFContext, LLVMDWARFContextRef)
>> > ```
>> > then defined some C functions
>> > ```
>> > LLVMDWARFContextRef LLVMCreateDWARFContext(LLVMBinaryRef Bin) {
>> >   std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(*unwrap(Bin));
>> >   return wrap(DICtx.release());
>> > }
>> >
>> > void LLVMPrintDWARFContext(LLVMDWARFContextRef C) {
>> >   DIDumpOptions DumpOpts;
>> >   DumpOpts.DumpType = DIDT_DebugInfo; // I only care about the .debug_info section
>> >   unwrap(C)->dump(outs(), DumpOpts);
>> > }
>> > ```
>> > However, I got a segfault when trying to dump the LLVMDWARFContextRef using the second function. More precisely, it segfaulted when dumping the attribute of the DWARFDie.
>> >
>> > I tried to do this instead to see if the wrapping/unwrapping has bugs
>> > ```
>> > LLVMDWARFContextRef LLVMCreateDWARFContext(LLVMBinaryRef Bin) {
>> >   std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(*unwrap(Bin));
>> >   LLVMDWARFContextRef C = wrap(DICtx.release());
>> >   LLVMPrintDWARFContext(C);
>> >   return C;
>> > }
>> > ```
>> > and the call to LLVMPrintDWARFContext did not segfault this time.
>> >
>> > Can anybody who knows about DWARFContext and DWARFDie tell me what I did wrong? Or is it a bug in DWARFDie::dump() method?
>> >
>> > Thank you very much for your help,
>> >
>> > Son Tuan Vu
>> > _______________________________________________
>> > LLVM Developers mailing list
>> > llvm-dev at lists.llvm.org
>> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


More information about the llvm-dev mailing list