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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20190424/edacf391/attachment.html>