Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH][gdb/breakpoint] Fix assert in jit_event_handler
@ 2021-05-20 15:29 Tom de Vries
  2021-05-20 16:22 ` Simon Marchi via Gdb-patches
  0 siblings, 1 reply; 7+ messages in thread
From: Tom de Vries @ 2021-05-20 15:29 UTC (permalink / raw)
  To: gdb-patches

Hi,

Consider a minimal test-case test.c:
...
int main (void) { return 0; }
...
which we can compile into llvm byte code using clang:
...
$ clang -g -S -emit-llvm --target=x86_64-unknown-unknown-elf test.c
...
and then run using lli, which uses the llvm jit:
...
$ lli test.ll
...

If we run this under gdb, we run into an assert:
...
$ gdb -q -batch -ex run --args /usr/bin/lli test.ll
Dwarf Error: Cannot not find DIE at 0x18a936e7 \
  [from module libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug]

[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
src/gdb/jit.c:1178: internal-error: \
  void jit_event_handler(gdbarch*, objfile*): \
  Assertion `jiter->jiter_data != nullptr' failed.
...

This is caused by the following.

When running jit_breakpoint_re_set_internal, we first handle
libLLVM.so.10.debug, and set a jit breakpoint.

Next we handle libLLVM.so.10:
...
(gdb) p the_objfile.original_name
$42 = 0x2494170 "libLLVM.so.10"
...
but the minimal symbols we find are from libLLVM.so.10.debug:
...
(gdb) p reg_symbol.objfile.original_name
$43 = 0x38e7c50 "libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug"
(gdb) p desc_symbol.objfile.original_name
$44 = 0x38e7c50 "libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug"
...
and consequently, the objf_data is the one from libLLVM.so.10.debug:
...
      jiter_objfile_data *objf_data
        = get_jiter_objfile_data (reg_symbol.objfile);
...
and so we hit this:
...
      if (objf_data->cached_code_address == addr)
        continue;
...
and no second jit breakpoint is inserted.

Subsequently, the jit breakpoint is triggered and handled, but when finding
the symbol for the breakpoint address we get:
...
(gdb) p jit_bp_sym.objfile.original_name
$52 = 0x2494170 "libLLVM.so.10"
...

The assert 'jiter->jiter_data != nullptr' triggers because it checks
libLLVM.so.10 while the one with jiter_data setup is libLLVM.so.10.debug.

This fixes the assert:
...
       jiter_objfile_data *objf_data
-        = get_jiter_objfile_data (reg_symbol.objfile);
-        = get_jiter_objfile_data (the_objfile);
...
but consequently we'll have two jit breakpoints, so we also make sure we don't
set a jit breakpoint on separate debug objects like libLLVM.so.10.debug.

Tested on x86_64-linux.

Any comments?

Thanks,
- Tom

[gdb/breakpoint] Fix assert in jit_event_handler

gdb/ChangeLog:

2021-05-20  Tom de Vries  <tdevries@suse.de>

	PR breakpoint/27889
	* jit.c (jit_breakpoint_re_set_internal): Skip separate debug
	objects.  Call get_jiter_objfile_data with the_objfile.

---
 gdb/jit.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/gdb/jit.c b/gdb/jit.c
index 296b436c796..be10f197fd6 100644
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -807,6 +807,10 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, program_space *pspace)
 {
   for (objfile *the_objfile : pspace->objfiles ())
     {
+      /* Skip separate debug objects.  */
+      if (the_objfile->separate_debug_objfile_backlink != nullptr)
+	continue;
+
       if (the_objfile->skip_jit_symbol_lookup)
 	continue;
 
@@ -833,7 +837,7 @@ jit_breakpoint_re_set_internal (struct gdbarch *gdbarch, program_space *pspace)
 	}
 
       jiter_objfile_data *objf_data
-	= get_jiter_objfile_data (reg_symbol.objfile);
+	= get_jiter_objfile_data (the_objfile);
       objf_data->register_code = reg_symbol.minsym;
       objf_data->descriptor = desc_symbol.minsym;
 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH][gdb/breakpoint] Fix assert in jit_event_handler
  2021-05-20 15:29 [PATCH][gdb/breakpoint] Fix assert in jit_event_handler Tom de Vries
@ 2021-05-20 16:22 ` Simon Marchi via Gdb-patches
  2021-05-20 22:04   ` Tom de Vries
  2021-05-21 11:27   ` Tom de Vries
  0 siblings, 2 replies; 7+ messages in thread
From: Simon Marchi via Gdb-patches @ 2021-05-20 16:22 UTC (permalink / raw)
  To: Tom de Vries, gdb-patches

On 2021-05-20 11:29 a.m., Tom de Vries wrote:
> Hi,
> 
> Consider a minimal test-case test.c:
> ...
> int main (void) { return 0; }
> ...
> which we can compile into llvm byte code using clang:
> ...
> $ clang -g -S -emit-llvm --target=x86_64-unknown-unknown-elf test.c
> ...
> and then run using lli, which uses the llvm jit:
> ...
> $ lli test.ll
> ...
> 
> If we run this under gdb, we run into an assert:
> ...
> $ gdb -q -batch -ex run --args /usr/bin/lli test.ll
> Dwarf Error: Cannot not find DIE at 0x18a936e7 \
>   [from module libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug]

I guess that's unrelated, but do you know if that error is a sign of
something wrong in GDB?

> 
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib64/libthread_db.so.1".
> src/gdb/jit.c:1178: internal-error: \
>   void jit_event_handler(gdbarch*, objfile*): \
>   Assertion `jiter->jiter_data != nullptr' failed.
> ...
> 
> This is caused by the following.
> 
> When running jit_breakpoint_re_set_internal, we first handle
> libLLVM.so.10.debug, and set a jit breakpoint.
> 
> Next we handle libLLVM.so.10:
> ...
> (gdb) p the_objfile.original_name
> $42 = 0x2494170 "libLLVM.so.10"
> ...
> but the minimal symbols we find are from libLLVM.so.10.debug:
> ...
> (gdb) p reg_symbol.objfile.original_name
> $43 = 0x38e7c50 "libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug"
> (gdb) p desc_symbol.objfile.original_name
> $44 = 0x38e7c50 "libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug"
> ...
> and consequently, the objf_data is the one from libLLVM.so.10.debug:
> ...
>       jiter_objfile_data *objf_data
>         = get_jiter_objfile_data (reg_symbol.objfile);
> ...
> and so we hit this:
> ...
>       if (objf_data->cached_code_address == addr)
>         continue;
> ...
> and no second jit breakpoint is inserted.
> 
> Subsequently, the jit breakpoint is triggered and handled, but when finding
> the symbol for the breakpoint address we get:
> ...
> (gdb) p jit_bp_sym.objfile.original_name
> $52 = 0x2494170 "libLLVM.so.10"
> ...
> 
> The assert 'jiter->jiter_data != nullptr' triggers because it checks
> libLLVM.so.10 while the one with jiter_data setup is libLLVM.so.10.debug.
> 
> This fixes the assert:
> ...
>        jiter_objfile_data *objf_data
> -        = get_jiter_objfile_data (reg_symbol.objfile);
> -        = get_jiter_objfile_data (the_objfile);

It's quite annoying that separate debug info files are represented by
"objfile"s...

> ...
> but consequently we'll have two jit breakpoints, so we also make sure we don't
> set a jit breakpoint on separate debug objects like libLLVM.so.10.debug.
> 
> Tested on x86_64-linux.

Does that fix some test when running the testsuite with the fission
board or something like that?  I think it would be important for this to
be tested.

Otherwise, LGTM.

Simon

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH][gdb/breakpoint] Fix assert in jit_event_handler
  2021-05-20 16:22 ` Simon Marchi via Gdb-patches
@ 2021-05-20 22:04   ` Tom de Vries
  2021-05-21 19:12     ` Tom de Vries
  2021-05-21 11:27   ` Tom de Vries
  1 sibling, 1 reply; 7+ messages in thread
From: Tom de Vries @ 2021-05-20 22:04 UTC (permalink / raw)
  To: Simon Marchi, gdb-patches; +Cc: Tom Tromey

On 5/20/21 6:22 PM, Simon Marchi wrote:
> On 2021-05-20 11:29 a.m., Tom de Vries wrote:
>> Hi,
>>
>> Consider a minimal test-case test.c:
>> ...
>> int main (void) { return 0; }
>> ...
>> which we can compile into llvm byte code using clang:
>> ...
>> $ clang -g -S -emit-llvm --target=x86_64-unknown-unknown-elf test.c
>> ...
>> and then run using lli, which uses the llvm jit:
>> ...
>> $ lli test.ll
>> ...
>>
>> If we run this under gdb, we run into an assert:
>> ...
>> $ gdb -q -batch -ex run --args /usr/bin/lli test.ll
>> Dwarf Error: Cannot not find DIE at 0x18a936e7 \
>>   [from module libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug]
> 
> I guess that's unrelated, but do you know if that error is a sign of
> something wrong in GDB?
> 

I assumed not (the last binary I checked where that message occurred was
a case of invalid dwarf) but ...

I did a readelf -wi and after 11G I did this grep:
...
$ grep 18a936e7 READELF
 <3><18a936e7>: Abbrev Number: 175 (DW_TAG_subprogram)
    <18aa358f>   DW_AT_specification: <0x18a936e7>
$
...

So this looks like a GDB problem.

I also did:
...
$ gdb -q -readnow
/usr/lib/debug/usr/lib64/libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug
Reading symbols from
/usr/lib/debug/usr/lib64/libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug...
Expanding full symbols from
/usr/lib/debug/usr/lib64/libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug...
(gdb)
...
so this could be something partial symbols related.

A bit more info:
...
  Compilation Unit @ offset 0x18a23e52:
  ...
 <0><18a23e5d>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <18a23e5e>   DW_AT_producer    : clang version 10.0.1
/home/abuild/rpmbuild/BUILD/llvm-10.0.1.src/stage1/bin/clang-10
--driver-mode=g++ -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D
__STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I lib/ExecutionEngine/Orc
-I ../lib/ExecutionEngine/Orc -I /usr/include/libxml2 -I include -I
../include -fmessage-length=0 -grecord-command-line -O2 -Wall -D
_FORTIFY_SOURCE=0 -fstack-protector-strong -funwind-tables
-fasynchronous-unwind-tables -fstack-clash-protection -D NDEBUG -fPIC
-fvisibility-inlines-hidden -Wall -Wextra -Wno-unused-parameter
-Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic
-Wno-long-long -Wimplicit-fallthrough -Wno-noexcept-type
-Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion
-fdiagnostics-color -ffunction-sections -fdata-sections -flto=thin -O2
-g -D NDEBUG -fno-exceptions -std=c++14 -MD -MT
lib/ExecutionEngine/Orc/CMakeFiles/LLVMOrcJIT.dir/LLJIT.cpp.o -MF
lib/ExecutionEngine/Orc/CMakeFiles/LLVMOrcJIT.dir/LLJIT.cpp.o.d -o
lib/ExecutionEngine/Orc/CMakeFiles/LLVMOrcJIT.dir/LLJIT.cpp.o -c
../lib/ExecutionEngine/Orc/LLJIT.cpp
    <18a23e62>   DW_AT_language    : 33 (C++14)
    <18a23e64>   DW_AT_name        : ../lib/ExecutionEngine/Orc/LLJIT.cpp
 ...
 <1><18a936d4>: Abbrev Number: 71 (DW_TAG_subprogram)
 <2><18a936d5>: Abbrev Number: 174 (DW_TAG_class_type)
    <18a936d7>   DW_AT_calling_convention: 5    (pass by value)
    <18a936d8>   DW_AT_byte_size   : 8
    <18a936d9>   DW_AT_decl_file   : 185
    <18a936da>   DW_AT_decl_line   : 78
 <3><18a936db>: Abbrev Number: 9 (DW_TAG_member)
    <18a936dc>   DW_AT_name        : this
    <18a936e0>   DW_AT_type        : <0x18a8bb20>
    <18a936e4>   DW_AT_decl_file   : 185
    <18a936e5>   DW_AT_decl_line   : 78
    <18a936e6>   DW_AT_data_member_location: 0
 <3><18a936e7>: Abbrev Number: 175 (DW_TAG_subprogram)
    <18a936e9>   DW_AT_name        : operator()
    <18a936ed>   DW_AT_decl_file   : 185
    <18a936ee>   DW_AT_decl_line   : 78
    <18a936ef>   DW_AT_type        : <0x18a557ad>
    <18a936f3>   DW_AT_declaration : 1
    <18a936f3>   DW_AT_external    : 1
    <18a936f3>   DW_AT_accessibility: 1 (public)

  ...

 <1><18aa3589>: Abbrev Number: 251 (DW_TAG_subprogram)
    <18aa358b>   DW_AT_linkage_name: _ZZN4llvm10ThreadPool4waitEvENK3$_1clEv
    <18aa358f>   DW_AT_specification: <0x18a936e7>
    <18aa3593>   DW_AT_inline      : 1  (inlined)
    <18aa3594>   DW_AT_object_pointer: <0x18aa3598>
  ...
  Compilation Unit @ offset 0x18aa33d6:
...

Thanks,
- Tom

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH][gdb/breakpoint] Fix assert in jit_event_handler
  2021-05-20 16:22 ` Simon Marchi via Gdb-patches
  2021-05-20 22:04   ` Tom de Vries
@ 2021-05-21 11:27   ` Tom de Vries
  2021-05-21 14:07     ` Simon Marchi via Gdb-patches
  2021-05-24 15:20     ` Tom Tromey
  1 sibling, 2 replies; 7+ messages in thread
From: Tom de Vries @ 2021-05-21 11:27 UTC (permalink / raw)
  To: Simon Marchi, gdb-patches

[-- Attachment #1: Type: text/plain, Size: 1536 bytes --]

On 5/20/21 6:22 PM, Simon Marchi wrote:
> It's quite annoying that separate debug info files are represented by
> "objfile"s...
> 

Yeah, indeed.

And you could even say that that's fine, but question whether they
should be in the objfiles list, that is, have the default behaviour of:
...
   for (objfile *the_objfile : pspace->objfiles ())
     {
+      /* Skip separate debug objects.  */
+      if (the_objfile->separate_debug_objfile_backlink != nullptr)
+       continue;
...
without having to specify this, and if you need to access the separate
debuginfo files, use the specific iterator for this.

>> ...
>> but consequently we'll have two jit breakpoints, so we also make sure we don't
>> set a jit breakpoint on separate debug objects like libLLVM.so.10.debug.
>>
>> Tested on x86_64-linux.
> 
> Does that fix some test when running the testsuite with the fission
> board or something like that?

No, though I ran into another problem :) while playing around with the
jit test-cases and target boards  (
https://sourceware.org/bugzilla/show_bug.cgi?id=27893 ).  [ And yet
another problem while looking into the missing DIE problem (
https://sourceware.org/bugzilla/show_bug.cgi?id=27894 ).

>  I think it would be important for this to
> be tested.
> 

I wrote this target board file, which does trigger this assert in the
jit test-cases, and verified that the patch fixes all of them.

During testing of the target board, I ran into another assert in
gdb.python/py-objfile.exp, will file that as well.  WDYT?

Thanks,
- Tom

[-- Attachment #2: 0002-gdb-testsuite-Add-target-board-cc-with-gnu-debuglink.exp.patch --]
[-- Type: text/x-patch, Size: 4289 bytes --]

[gdb/testsuite] Add target board cc-with-gnu-debuglink.exp

Add target board cc-with-gnu-debuglink.exp that splits off debuginfo into 
a
seperate .debug file and links to it using .gnu_debuglink.

Tested on x86_64-linux.

gdb/ChangeLog:

2021-05-21  Tom de Vries  <tdevries@suse.de>

	* contrib/cc-with-tweaks.sh: Handle -l.

gdb/testsuite/ChangeLog:

2021-05-21  Tom de Vries  <tdevries@suse.de>

	* boards/cc-with-gnu-debuglink.exp: New file.

---
 gdb/contrib/cc-with-tweaks.sh                  | 46 +++++++++++++++++++++++++-
 gdb/testsuite/boards/cc-with-gnu-debuglink.exp | 26 +++++++++++++++
 2 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/gdb/contrib/cc-with-tweaks.sh b/gdb/contrib/cc-with-tweaks.sh
index 2eda76a89c2..8653dfb260e 100755
--- a/gdb/contrib/cc-with-tweaks.sh
+++ b/gdb/contrib/cc-with-tweaks.sh
@@ -45,6 +45,7 @@
 # -i make an index (.gdb_index)
 # -n make a dwarf5 index (.debug_names)
 # -p create .dwp files (Fission), you need to also use gcc option -gsplit-dwarf
+# -l creates separate debuginfo files linked to using .gnu_debuglink
 # If nothing is given, no changes are made
 
 myname=cc-with-tweaks.sh
@@ -83,6 +84,7 @@ want_dwz=false
 want_multi=false
 want_dwp=false
 want_objcopy_compress=false
+want_gnu_debuglink=false
 
 while [ $# -gt 0 ]; do
     case "$1" in
@@ -92,6 +94,7 @@ while [ $# -gt 0 ]; do
 	-n) want_index=true; index_options=-dwarf-5;;
 	-m) want_multi=true ;;
 	-p) want_dwp=true ;;
+	-l) want_gnu_debuglink=true ;;
 	*) break ;;
     esac
     shift
@@ -158,7 +161,12 @@ fi
 
 get_tmpdir ()
 {
-    tmpdir=$(dirname "$output_file")/.tmp
+    subdir="$1"
+    if [ "$subdir" = "" ]; then
+	subdir=.tmp
+    fi
+
+    tmpdir=$(dirname "$output_file")/"$subdir"
     mkdir -p "$tmpdir"
 }
 
@@ -234,4 +242,40 @@ if [ "$want_dwp" = true ]; then
     fi
 fi
 
+if [ "$want_gnu_debuglink" = true ]; then
+    # Based on gdb_gnu_strip_debug.
+
+    # Gdb looks for the .gnu_debuglink file in the .debug subdirectory
+    # of the directory of the executable.
+    get_tmpdir .debug
+
+    stripped_file="$tmpdir"/$(basename "$output_file").stripped
+    debug_file="$tmpdir"/$(basename "$output_file").debug
+
+    # Create stripped and debug versions of output_file.
+    strip --strip-debug "${output_file}" \
+	  -o "${stripped_file}"
+    rc=$?
+    [ $rc != 0 ] && exit $rc
+    strip --only-keep-debug "${output_file}" \
+	  -o "${debug_file}"
+    rc=$?
+    [ $rc != 0 ] && exit $rc
+
+    # The .gnu_debuglink is supposed to contain no leading directories.
+    link=$(basename "${debug_file}")
+
+    (
+	# Temporarily cd to tmpdir to allow objcopy to find $link
+	cd "$tmpdir" || exit 1
+
+	# Overwrite output_file with stripped version containing
+	# .gnu_debuglink to debug_file.
+	objcopy --add-gnu-debuglink="$link" "${stripped_file}" \
+		"${output_file}"
+	rc=$?
+	[ $rc != 0 ] && exit $rc
+    )
+fi
+
 exit $rc
diff --git a/gdb/testsuite/boards/cc-with-gnu-debuglink.exp b/gdb/testsuite/boards/cc-with-gnu-debuglink.exp
new file mode 100644
index 00000000000..ca977d9f165
--- /dev/null
+++ b/gdb/testsuite/boards/cc-with-gnu-debuglink.exp
@@ -0,0 +1,26 @@
+# Copyright 2021 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# This file is a dejagnu "board file" and is used to run the testsuite
+# with contrib/cc-with-tweaks.sh -l.
+#
+# Example usage:
+# bash$ cd $objdir
+# bash$ make check-gdb \
+#   RUNTESTFLAGS='--target_board=cc-with-gnu-debuglink'
+#
+
+set CC_WITH_TWEAKS_FLAGS "-l"
+load_board_description "cc-with-tweaks"

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH][gdb/breakpoint] Fix assert in jit_event_handler
  2021-05-21 11:27   ` Tom de Vries
@ 2021-05-21 14:07     ` Simon Marchi via Gdb-patches
  2021-05-24 15:20     ` Tom Tromey
  1 sibling, 0 replies; 7+ messages in thread
From: Simon Marchi via Gdb-patches @ 2021-05-21 14:07 UTC (permalink / raw)
  To: Tom de Vries, gdb-patches

On 2021-05-21 7:27 a.m., Tom de Vries wrote:
> On 5/20/21 6:22 PM, Simon Marchi wrote:
>> It's quite annoying that separate debug info files are represented by
>> "objfile"s...
>>
> 
> Yeah, indeed.
> 
> And you could even say that that's fine, but question whether they
> should be in the objfiles list, that is, have the default behaviour of:
> ...
>    for (objfile *the_objfile : pspace->objfiles ())
>      {
> +      /* Skip separate debug objects.  */
> +      if (the_objfile->separate_debug_objfile_backlink != nullptr)
> +       continue;
> ...
> without having to specify this, and if you need to access the separate
> debuginfo files, use the specific iterator for this.

I think that would be a good idea to explore.

In my opinion, the fact that an objfile has separate debug info should
be pretty much transparent to the rest of GDB.  So I think it would make
sense for these special objfiles to be hidden, unless you explicitly ask
for them.

>>> ...
>>> but consequently we'll have two jit breakpoints, so we also make sure we don't
>>> set a jit breakpoint on separate debug objects like libLLVM.so.10.debug.
>>>
>>> Tested on x86_64-linux.
>>
>> Does that fix some test when running the testsuite with the fission
>> board or something like that?
> 
> No, though I ran into another problem :) while playing around with the
> jit test-cases and target boards  (
> https://sourceware.org/bugzilla/show_bug.cgi?id=27893 ).

Well, good news that you caught it!

> [ And yet
> another problem while looking into the missing DIE problem (
> https://sourceware.org/bugzilla/show_bug.cgi?id=27894 ).

I do stumble on that sometimes.

> 
>>  I think it would be important for this to
>> be tested.
>>
> 
> I wrote this target board file, which does trigger this assert in the
> jit test-cases, and verified that the patch fixes all of them.

I thought that fission meant "separate debug info", but I think I was
wrong... I always confuse fission and separate debug info.

We don't already have a board file that generates separate debug info,
in that sense:

  https://sourceware.org/gdb/current/onlinedocs/gdb/Separate-Debug-Files.html

?  Looks like we don't, so it would be useful to add one.  Since there
are two ways of specifying separate debug info (by debuglink and by
build-id, I think it would be nice to have a board for each.  But just
adding the debuglink one would already be an improvement.  And once the
separate debug info file is found, I guess the code paths don't differ
much based on through which method the file was found.

> During testing of the target board, I ran into another assert in
> gdb.python/py-objfile.exp, will file that as well.  WDYT?

I think that board file should be added.

Simon

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH][gdb/breakpoint] Fix assert in jit_event_handler
  2021-05-20 22:04   ` Tom de Vries
@ 2021-05-21 19:12     ` Tom de Vries
  0 siblings, 0 replies; 7+ messages in thread
From: Tom de Vries @ 2021-05-21 19:12 UTC (permalink / raw)
  To: Simon Marchi, gdb-patches; +Cc: Tom Tromey

On 5/21/21 12:04 AM, Tom de Vries wrote:
> On 5/20/21 6:22 PM, Simon Marchi wrote:
>> On 2021-05-20 11:29 a.m., Tom de Vries wrote:
>>> Hi,
>>>
>>> Consider a minimal test-case test.c:
>>> ...
>>> int main (void) { return 0; }
>>> ...
>>> which we can compile into llvm byte code using clang:
>>> ...
>>> $ clang -g -S -emit-llvm --target=x86_64-unknown-unknown-elf test.c
>>> ...
>>> and then run using lli, which uses the llvm jit:
>>> ...
>>> $ lli test.ll
>>> ...
>>>
>>> If we run this under gdb, we run into an assert:
>>> ...
>>> $ gdb -q -batch -ex run --args /usr/bin/lli test.ll
>>> Dwarf Error: Cannot not find DIE at 0x18a936e7 \
>>>   [from module libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug]
>>
>> I guess that's unrelated, but do you know if that error is a sign of
>> something wrong in GDB?
>>
> 
> I assumed not (the last binary I checked where that message occurred was
> a case of invalid dwarf) but ...
> 
> I did a readelf -wi and after 11G I did this grep:
> ...
> $ grep 18a936e7 READELF
>  <3><18a936e7>: Abbrev Number: 175 (DW_TAG_subprogram)
>     <18aa358f>   DW_AT_specification: <0x18a936e7>
> $
> ...
> 
> So this looks like a GDB problem.
> 
> I also did:
> ...
> $ gdb -q -readnow
> /usr/lib/debug/usr/lib64/libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug
> Reading symbols from
> /usr/lib/debug/usr/lib64/libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug...
> Expanding full symbols from
> /usr/lib/debug/usr/lib64/libLLVM.so.10-10.0.1-lp152.30.4.x86_64.debug...
> (gdb)
> ...
> so this could be something partial symbols related.
> 
> A bit more info:
> ...
>   Compilation Unit @ offset 0x18a23e52:
>   ...
>  <0><18a23e5d>: Abbrev Number: 1 (DW_TAG_compile_unit)
>     <18a23e5e>   DW_AT_producer    : clang version 10.0.1
> /home/abuild/rpmbuild/BUILD/llvm-10.0.1.src/stage1/bin/clang-10
> --driver-mode=g++ -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D
> __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I lib/ExecutionEngine/Orc
> -I ../lib/ExecutionEngine/Orc -I /usr/include/libxml2 -I include -I
> ../include -fmessage-length=0 -grecord-command-line -O2 -Wall -D
> _FORTIFY_SOURCE=0 -fstack-protector-strong -funwind-tables
> -fasynchronous-unwind-tables -fstack-clash-protection -D NDEBUG -fPIC
> -fvisibility-inlines-hidden -Wall -Wextra -Wno-unused-parameter
> -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic
> -Wno-long-long -Wimplicit-fallthrough -Wno-noexcept-type
> -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion
> -fdiagnostics-color -ffunction-sections -fdata-sections -flto=thin -O2
> -g -D NDEBUG -fno-exceptions -std=c++14 -MD -MT
> lib/ExecutionEngine/Orc/CMakeFiles/LLVMOrcJIT.dir/LLJIT.cpp.o -MF
> lib/ExecutionEngine/Orc/CMakeFiles/LLVMOrcJIT.dir/LLJIT.cpp.o.d -o
> lib/ExecutionEngine/Orc/CMakeFiles/LLVMOrcJIT.dir/LLJIT.cpp.o -c
> ../lib/ExecutionEngine/Orc/LLJIT.cpp
>     <18a23e62>   DW_AT_language    : 33 (C++14)
>     <18a23e64>   DW_AT_name        : ../lib/ExecutionEngine/Orc/LLJIT.cpp
>  ...
>  <1><18a936d4>: Abbrev Number: 71 (DW_TAG_subprogram)
>  <2><18a936d5>: Abbrev Number: 174 (DW_TAG_class_type)
>     <18a936d7>   DW_AT_calling_convention: 5    (pass by value)
>     <18a936d8>   DW_AT_byte_size   : 8
>     <18a936d9>   DW_AT_decl_file   : 185
>     <18a936da>   DW_AT_decl_line   : 78
>  <3><18a936db>: Abbrev Number: 9 (DW_TAG_member)
>     <18a936dc>   DW_AT_name        : this
>     <18a936e0>   DW_AT_type        : <0x18a8bb20>
>     <18a936e4>   DW_AT_decl_file   : 185
>     <18a936e5>   DW_AT_decl_line   : 78
>     <18a936e6>   DW_AT_data_member_location: 0
>  <3><18a936e7>: Abbrev Number: 175 (DW_TAG_subprogram)
>     <18a936e9>   DW_AT_name        : operator()
>     <18a936ed>   DW_AT_decl_file   : 185
>     <18a936ee>   DW_AT_decl_line   : 78
>     <18a936ef>   DW_AT_type        : <0x18a557ad>
>     <18a936f3>   DW_AT_declaration : 1
>     <18a936f3>   DW_AT_external    : 1
>     <18a936f3>   DW_AT_accessibility: 1 (public)
> 
>   ...
> 
>  <1><18aa3589>: Abbrev Number: 251 (DW_TAG_subprogram)
>     <18aa358b>   DW_AT_linkage_name: _ZZN4llvm10ThreadPool4waitEvENK3$_1clEv
>     <18aa358f>   DW_AT_specification: <0x18a936e7>
>     <18aa3593>   DW_AT_inline      : 1  (inlined)
>     <18aa3594>   DW_AT_object_pointer: <0x18aa3598>
>   ...
>   Compilation Unit @ offset 0x18aa33d6:
> ...

Filed here ( https://sourceware.org/bugzilla/show_bug.cgi?id=27898 ).

Thanks,
- Tom

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH][gdb/breakpoint] Fix assert in jit_event_handler
  2021-05-21 11:27   ` Tom de Vries
  2021-05-21 14:07     ` Simon Marchi via Gdb-patches
@ 2021-05-24 15:20     ` Tom Tromey
  1 sibling, 0 replies; 7+ messages in thread
From: Tom Tromey @ 2021-05-24 15:20 UTC (permalink / raw)
  To: Tom de Vries; +Cc: gdb-patches

>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:

Simon> It's quite annoying that separate debug info files are represented by
Simon> "objfile"s...

Tom> Yeah, indeed.

Tom> And you could even say that that's fine, but question whether they
Tom> should be in the objfiles list, that is, have the default behaviour of:

I've long thought this was a design error, and that having the separate
debug objfile be replaced with supplementary BFDs attached to the main
objfile would be a better design.

If someone wants to implement this, I'm all for it.

Tom

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-05-24 15:20 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-20 15:29 [PATCH][gdb/breakpoint] Fix assert in jit_event_handler Tom de Vries
2021-05-20 16:22 ` Simon Marchi via Gdb-patches
2021-05-20 22:04   ` Tom de Vries
2021-05-21 19:12     ` Tom de Vries
2021-05-21 11:27   ` Tom de Vries
2021-05-21 14:07     ` Simon Marchi via Gdb-patches
2021-05-24 15:20     ` Tom Tromey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox