Hi Vinod,
EDC was
written to support up to Dwarf version 3. At the time
version 4 had not been released. I’m not sure if the
bug you’re seeing is related specifically to version 4,
or if it’s just something unexpected in the general
dwarf info. My guess would be the latter. Which
compiler are you using? Some build tools let you choose
which debug format to generate with a switch. That
could be a workaround.
Thanks,
Warren
Hi Warren,
It’s very
sad to say that myself again stuck with the Dwarf stuff.
This time it’s related to the Dwarf version 4. I found
that my code, which using EDC Dwarf reader not working
properly with Dwarf 4 (it’s working perfectly with Dwarf
version 2). Especially it’s not getting any info about
‘C’ files but it’s working fine with ‘asm’ files. So my
question is simple, does the EDC Dwarf reader support
Dwarf version 4. If so, is there any API change specific
to Dwarf 4.
I believe
this is because GCC generates absolute paths in Dwarf on
Windows without the drive letter in many cases. You
could argue that it shouldn’t when not generated on
Windows, or be controlled by a pref. You can probably
log a bug for it, but currently there are no committers
and it’s not being built as part of CDT. For now you’ll
have to fix it locally and do your own build.
Thanks,
Warren
Hey Warren,
The line
info provider stuff worked fine. Think that we can
proceed with it. Thanks for your help. J
Here I
would like to discuss about one more issue related to
dwarf reader. What I have done so far to get this issue
is described below.
=>
I have a
vmlinux elf, which was compiled in the target file
system (/home/somedirectory). I have used it to get the
source file information using DwarfDebugInfoProvider. getSourceFiles API
on a
windows machine (copied the vmlinux.elf to some folder
in the D drive), I got source file path like
D:/home/somedirectory. Which is not expected.
=>
On further
investigation, I found that it’s the problem with DwarfFileHelper class
and its normalizeFilePath
API. In this API, there were some checks like
HostOS.IS_WIN32, and which makes the issue.
Is it a
valid scenario?
Is there
any further developments ongoing with EDC dwarf reader?
Can I
report a bug and submit a patch?
It’s
possible there’s a memory leak in there somewhere. I
don’t see how this snippet is doing what you listed as
your requirements though. I think you’d want to get the
line info provider for each compile unit for 1/2/3. For
4 you can simply get symbol at address (if any). That
will work for code, not data. There is no
correspondence between variable declaration/definition
and source line.
Hi Warren,
I have
changed my VM args as you mentioned below. But the code
snippet given below is still causing the same problem L.
Can you
please check whether the usage of API’s in the snippet
is correct or not (Please take a trial run).
Hi Vinod,
It’s
strange that you’d run out of memory parsing a 92MB
file, as we were parsing files ~1GB. Check your vm heap
arguments. I assume you’re either running/debugging
this from Eclipse. If so, edit the VM args in the
arguments tab of your launch config to have something
like –Xms256m -Xmx512m.
Thanks,
Warren
Hi Warren,
Sorry to
say that still I got some trouble with dwarf reader
stuff. This time we need to parse VMLINUX image (92 MB)
as a part of adding Linux support.
Actually I
am interested on following things.
1. Source file names
2. Address of each source line inside
each source file
3. Line number
4. Symbol information in that line ,
if it is present ( function, global variable etc.) and
its type
I am using
the repository @ eclipse/cdt.edc in GITHUB. Still I am
doing some tests with LineInfoProvider and other stuffs,
which I got from the Test cases in the repository.
Please see
the code snippet I have used .
Path modulePath = new Path("D:/vinod/vmlinux");//Linux kernal
path
ElfExecutableSymbolicsReaderFactory fact = new
ElfExecutableSymbolicsReaderFactory();
IExecutableSymbolicsReader exeReader = fact.createExecutableSymbolicsReader(modulePath);
DwarfDebugInfoProvider dip = new
DwarfDebugInfoProvider(exeReader);
Map<String, List<PublicNameInfo>> variables = dip.getPublicVariables();
final
Iterator<Entry<String, List<PublicNameInfo>>>
it = variables.entrySet().iterator();
while
(it.hasNext()) {
IPath file = null;
Map.Entry pairs = (Map.Entry) it.next();
final String
variableName = (String) pairs.getKey();
IModuleScope moduleScope = dip.getModuleScope();
if(null !=
moduleScope){
moduleScope.getVariablesByName(variableName, false);
//moduleScope.get
Collection<ISymbol> unMangledSymbols = dip.getExecutableSymbolicsReader().findUnmangledSymbols(variableName);
for(ISymbol
symbol: unMangledSymbols){
System.out.println(symbol.getName()
+ symbol.getAddress());
}
}
}
I got the
following Exception ,
Exception
in thread "main" java.lang.OutOfMemoryError: Java heap
space
at
org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfInfoReader.parseCompilationUnitForAddressesPrivate(DwarfInfoReader.java:853)
at
org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfInfoReader.parseCompilationUnitForAddresses(DwarfInfoReader.java:870)
at
org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfDebugInfoProvider.getVariablesByName(DwarfDebugInfoProvider.java:961)
at
org.eclipse.cdt.debug.edc.internal.symbols.dwarf.DwarfModuleScope.getVariablesByName(DwarfModuleScope.java:134)
at MemmoryLeakMain.main(MemmoryLeakMain.java:45)
Expecting a
swift response. J
No
problem. I’m glad it helped.
This might
be a good time to ask the list if anyone else out there
is using EDC? It sort of died when the Nokia group fell
apart, but we’ve been quietly resurrecting it here at
Silicon Labs (with some of the same team from Nokia and
former CDT committers). At some point we’re planning on
contributing back our changes and possibly volunteering
some committers to help maintain it going forward.
Doug, I’ve
been meaning to talk to you about this but have just
been too swamped.
Anyway, I’m
just gauging interest at this point.
Thanks,
Warren
Hi Warren,
Thanks for
the response, it’s a cool one and help me to solve the
problems.
Thanks,
Vinod
Hi Vinod,
If this is
a pure embedded target where the executable will not be
relocated, then you can use the symbol table. See
org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader.findSymbols(String)
or
org.eclipse.cdt.debug.edc.symbols.IExecutableSymbolicsReader.findUnmangledSymbols(String).
Otherwise
you’ll the module to get the relocated address. See
org.eclipse.cdt.debug.edc.symbols.IModuleScope.getVariablesByName(String,
boolean). Once you have the IVariable you’re looking
for, you can resolve the runtime address by getting the
ILocationProvider, then the IVariableLocation, then the
IAddress.
I hope that
helps.
Thanks,
Warren
Hi All,
We are facing a problem with getting
address of global variables using Dwarf Reader (from EDC
project).
I can’t find a API which gives the
constant address for a global variable (I have checked
with Variable.java ).
Hope somebody can give a better option
to get the same without any side effects.
Thanks in Advance,
Vinod