a problem with source listing in my lldb port

Source listing is not working in my lldb port. For the command “source list -n main” I got the following output:

File: workplace/app/src/workplace/app/src/main.c.

Also when a breakpoint is hit, the corresponding source code lines are not displayed.

I debugged lldb and found that the path to source file is calculated by combining ‘cu_comp_dir’ (DW_AT_comp_dir) and ‘cu_die_name’ (DW_AT_name).

The DWARF info generated is as follows:

<1cb> DW_AT_name : (indirect string, offset: 0x129): workplace/app/src/main.c
<1cf> DW_AT_comp_dir : (indirect string, offset: 0x14d): workplace/app/src

Just for experimentation, I removed the inclusion of ‘cu_comp_dir’ (DW_AT_comp_dir) in the source file path calculation (by editing DWARFDebugLine.cpp and SymbolFileDWARF.cpp). After this, the ‘source list’ command works, also the source lines are displayed for the breakpoint hit.

I need a clarification on where the problem is? Can someone help me on this?

Chandra Kumar R.

The DW_AT_name is supposed to be relative to the DW_AT_comp_dir. The DWARF spec is actually a little fuzzy about this when describing the compilation unit, it says it has:

  • A DW_AT_name attribute whose value is a null-terminated string containing the full or relative path name of the primary source file from which the compilation unit was derived.


  • A DW_AT_comp_dir attribute whose value is a null-terminated string containing the current working directory of the compilation command that produced this compilation unit in whatever form makes sense for the host system.

It doesn't actually say "relative to what" in the DW_AT_name description, but there isn't anything for it to be relative to but the DW_AT_comp_dir, and when file names are used in the line tables it makes it clear that they are relative to the DW_AT_comp_dir for the compilation unit. So you have to fix your DWARF output so that either the DW_AT_name is a full path, or a path relative to the DW_AT_comp_dir.


Look alike the problem is DW_AT_comp_dir is not a full path to the current working directory. Looks like a compiler bug.