Bug 16470 - Crash when inspecting STL containers with GDB pretty print
Summary: Crash when inspecting STL containers with GDB pretty print
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: python (show other bugs)
Version: 7.6
: P2 critical
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-01-20 12:50 UTC by Axel Müller
Modified: 2023-08-31 19:21 UTC (History)
5 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Axel Müller 2014-01-20 12:50:59 UTC
I have the following source code:
#include <list>
using namespace std;

int main()
{
list<int> x;
list<int> y;

x.push_back(1);
y.push_back(2);

return 0;
}

I installed the python pretty printers for STL from the GNU website and load them in my .gdbinit.
GDB crashes when I inspect the STL list.

To reproduce from the command line:
gdb -i mi -nx

-enable-pretty-printing
-gdb-set print object on
source /home/amueller/.gdbinit
-file-exec-and-symbols --thread-group i1 /home/amueller/testing/test
-break-insert --thread-group i1 -f /home/amueller/testing/test.cpp:12
-break-insert --thread-group i1 -t -f main
-exec-run --thread-group i1

-var-create --thread-group i1 - * x
-var-create --thread 1 --frame 0 - * x
-var-list-children var2
-exec-continue --thread 1

-var-update 1 var2

The bug was initially reported for Eclipse but also occurs using the command line gdb. See http://www.eclipse.org/forums/index.php/t/636361/
Comment 1 Yao Qi 2014-01-26 09:28:15 UTC
(In reply to Axel Müller from comment #0)

> 
> I installed the python pretty printers for STL from the GNU website and load
> them in my .gdbinit.

Where can we get the python pretty printer? and how do you load them into GDB?

> GDB crashes when I inspect the STL list.
> 
> To reproduce from the command line:
> gdb -i mi -nx
> 
> -enable-pretty-printing
> -gdb-set print object on
> source /home/amueller/.gdbinit

We don't know what your ~/.gdbinit is, so could you please give us the steps in your ~/.gdbinit?
Comment 2 Jan Pohanka 2014-01-27 07:21:33 UTC
I can also reproduce this bug using Axel's steps. 

This is the content of my ~/.gdbinit

add-auto-load-safe-path /home/honza/dev

python
import sys
sys.path.insert(0, '/home/honza/dev/gdb-pretty')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

set print pretty on
set print object on
set print static-members on
set print vtbl on
set print demangle on
set demangle-style gnu-v3

On https://sourceware.org/gdb/wiki/STLSupport there is a description how to get the pretty printers.

After passing the MI commands to GDB as Axel described, I'm getting following error

~"/home/zumbi/gdb-7.6.1/gdb/varobj.c:3532: internal-error: c_value_of_variable: Assertion `!value_lazy (var->value)' failed.\nA problem internal to GDB has been detected,\nfurther debugging may prove unreliable.\nQuit this debugging session? "
~"(y or n) "
n
~"/home/zumbi/gdb-7.6.1/gdb/varobj.c:3532: internal-error: c_value_of_variable: Assertion `!value_lazy (var->value)' failed.\nA problem internal to GDB has been detected,\nfurther debugging may prove unreliable.\nCreate a core file of GDB? "
~"(y or n) "
n
^error,msg="unknown error"
(gdb)
Comment 3 Yao Qi 2014-01-27 08:31:45 UTC
I can't reproduce it on GDB 7.6, 7.6.1 and mainline on X86-Fedora16. :(

$ ./gdb -i mi --data-directory=./data-directory/                                                              
=thread-group-added,id="i1"                                                                                                                                  
~"GNU gdb (GDB) 7.6\n"
~"Copyright (C) 2013 Free Software Foundation, Inc.\n"                                                                                                       
~"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.  Type \"show copying\"\nand \"show warranty\" for details.\n"                                                  
~"This GDB was configured as \"i686-pc-linux-gnu\".\nFor bug reporting instructions, please see:\n"                                                          
~"<http://www.gnu.org/software/gdb/bugs/>.\n"                                                                                                                
(gdb)                                                                                                                                                        
set print pretty on                                                                                                                                          
&"set print pretty on\n"                                                                                                                                     
=cmd-param-changed,param="print pretty",value="on"                                                                                                           
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
set print object on                                                                                                                                          
&"set print object on\n"                                                                                                                                     
=cmd-param-changed,param="print object",value="on"                                                                                                           
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
set print static-members on                                                                                                                                  
&"set print static-members on\n"                                                                                                                             
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
set print vtbl on                                                                                                                                            
&"set print vtbl on\n"                                                                                                                                       
=cmd-param-changed,param="print vtbl",value="on"                                                                                                             
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
set print demangle on                                                                                                                                        
&"set print demangle on\n"                                                                                                                                   
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
set demangle-style gnu-v3                                                                                                                                    
&"set demangle-style gnu-v3\n"                                                                                                                               
=cmd-param-changed,param="demangle-style",value="gnu-v3"                                                                                                     
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
-enable-pretty-printing                                                                                                                                      
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
-gdb-set print object on                                                                                                                                     
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
source /tmp/1.txt                                                                                                                                            
&"source /tmp/1.txt\n"                                                                                                                                       
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
-file-exec-and-symbols --thread-group i1 /tmp/1.exe                                                                                                          
^done                                                                                                                                                        
(gdb)                                                                                                                                                        
-break-insert --thread-group i1 -f /tmp/1.cc:12                                                                                                              
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0804863e",func="main()",file="1.cc",fullname="/tmp/1.cc",line="12",thread-groups=["i1"],times="0",original-location="/tmp/1.cc:12"}                                                                                                              
(gdb)                                                                                                                                                        
-break-insert --thread-group i1 -t -f main                                                                                                                   
^done,bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x080485ee",func="main()",file="1.cc",fullname="/tmp/1.cc",line="6",thread-groups=["i1"],times="0",original-location="main"}                                                                                                                        
(gdb)                                                                                                                                                        
-exec-run --thread-group i1                                                                                                                                  
=thread-group-started,id="i1",pid="11180"                                                                                                                    
=thread-created,id="1",group-id="i1"                                                                                                                         
^running
*running,thread-id="all"
(gdb) 
=library-loaded,id="/lib/ld-linux.so.2",target-name="/lib/ld-linux.so.2",host-name="/lib/ld-linux.so.2",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/usr/lib/libstdc++.so.6",target-name="/usr/lib/libstdc++.so.6",host-name="/usr/lib/libstdc++.so.6",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/lib/libm.so.6",target-name="/lib/libm.so.6",host-name="/lib/libm.so.6",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/lib/libgcc_s.so.1",target-name="/lib/libgcc_s.so.1",host-name="/lib/libgcc_s.so.1",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/lib/libc.so.6",target-name="/lib/libc.so.6",host-name="/lib/libc.so.6",symbols-loaded="0",thread-group="i1"
=breakpoint-modified,bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x080485ee",func="main()",file="1.cc",fullname="/tmp/1.cc",line="6",thread-groups=["i1"],times="1",original-location="main"}
*stopped,reason="breakpoint-hit",disp="del",bkptno="2",frame={addr="0x080485ee",func="main",args=[],file="1.cc",fullname="/tmp/1.cc",line="6"},thread-id="1",stopped-threads="all",core="2"
=breakpoint-deleted,id="2"
(gdb) 
-var-create --thread-group i1 - * x
^done,name="var1",numchild="0",value="{...}",type="std::list<int, std::allocator<int> >",thread-id="1",dynamic="1",has_more="1"
(gdb) 
-var-create --thread 1 --frame 0 - * x
^done,name="var2",numchild="0",value="{...}",type="std::list<int, std::allocator<int> >",thread-id="1",dynamic="1",has_more="1"
(gdb) 
-var-list-children var2
^done,numchild="3",children=[child={name="var2.[0]",exp="[0]",numchild="0",type="int",thread-id="1"},child={name="var2.[1]",exp="[1]",numchild="0",type="int",thread-id="1"},child={name="var2.[2]",exp="[2]",numchild="0",type="int",thread-id="1"}],has_more="0"
(gdb) 
-exec-continue --thread 1
^running
*running,thread-id="all"
(gdb) 
=breakpoint-modified,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0804863e",func="main()",file="1.cc",fullname="/tmp/1.cc",line="12",thread-groups=["i1"],times="1",original-location="/tmp/1.cc:12"}
*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame={addr="0x0804863e",func="main",args=[],file="1.cc",fullname="/tmp/1.cc",line="12"},thread-id="1",stopped-threads="all",core="0"
(gdb) 
-var-update 1 var2
^done,changelist=[{name="var2",value="{...}",in_scope="true",type_changed="false",new_num_children="1",dynamic="1",has_more="0"},{name="var2.[0]",value="1",in_scope="true",type_changed="false",has_more="0"}]
(gdb) 
-gdb-exit
^exit
=thread-exited,id="1",group-id="i1"
=thread-group-exited,id="i1"

$ cat /tmp/1.txt
python
import sys
sys.path.insert(0, '/home/yao/Source/gnu/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
Comment 4 Jan Pohanka 2014-01-27 12:14:54 UTC
I have compiled GDB 7.6.2 from source and still can reproduce the bug. I'm running Debian testing.

Can sharing the GDB corefile help?

=thread-group-added,id="i1"
~"GNU gdb (GDB) 7.6.2\n"
~"Copyright (C) 2013 Free Software Foundation, Inc.\n"
~"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.  Type \"show copying\"\nand \"show warranty\" for details.\n"
~"This GDB was configured as \"x86_64-unknown-linux-gnu\".\nFor bug reporting instructions, please see:\n"
~"<http://www.gnu.org/software/gdb/bugs/>.\n"
(gdb) 
-enable-pretty-printing
-gdb-set print object on

source .gdbinit

-file-exec-and-symbols --thread-group i1 /home/honza/dev/test/stl_test/stl_test
-break-insert --thread-group i1 -f /home/honza/dev/test/stl_test/stl_test.cpp:12
-break-insert --thread-group i1 -t -f main
-exec-run --thread-group i1

-var-create --thread-group i1 - * x
-var-create --thread 1 --frame 0 - * x
-var-list-children var2
-exec-continue --thread 1

-var-update 1 var2^done
(gdb) 
^done
(gdb) 
&"\n"
^done
(gdb) 
&"source .gdbinit\n"
=cmd-param-changed,param="print pretty",value="on"
=cmd-param-changed,param="print vtbl",value="on"
=cmd-param-changed,param="demangle-style",value="gnu-v3"
^done
(gdb) 
&"\n"
^done
(gdb) 
^done
(gdb) 
^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0000000000400952",func="main()",file="stl_test.cpp",fullname="/home/honza/dev/test/stl_test/stl_test.cpp",line="12",thread-groups=["i1"],times="0",original-location="/home/honza/dev/test/stl_test/stl_test.cpp:12"}
(gdb) 
^done,bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x0000000000400906",func="main()",file="stl_test.cpp",fullname="/home/honza/dev/test/stl_test/stl_test.cpp",line="6",thread-groups=["i1"],times="0",original-location="main"}
(gdb) 
=thread-group-started,id="i1",pid="13100"
=thread-created,id="1",group-id="i1"
^running
*running,thread-id="all"
(gdb) 
=library-loaded,id="/lib64/ld-linux-x86-64.so.2",target-name="/lib64/ld-linux-x86-64.so.2",host-name="/lib64/ld-linux-x86-64.so.2",symbols-loaded="0",thread-group="i1"
=library-loaded,id="linux-vdso.so.1",target-name="linux-vdso.so.1",host-name="linux-vdso.so.1",symbols-loaded="0",thread-group="i1"
&"warning: Could not load shared library symbols for linux-vdso.so.1.\nDo you need \"set solib-search-path\" or \"set sysroot\"?"
&"\n"
=library-loaded,id="/usr/lib/x86_64-linux-gnu/libstdc++.so.6",target-name="/usr/lib/x86_64-linux-gnu/libstdc++.so.6",host-name="/usr/lib/x86_64-linux-gnu/libstdc++.so.6",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/lib/x86_64-linux-gnu/libm.so.6",target-name="/lib/x86_64-linux-gnu/libm.so.6",host-name="/lib/x86_64-linux-gnu/libm.so.6",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/lib/x86_64-linux-gnu/libgcc_s.so.1",target-name="/lib/x86_64-linux-gnu/libgcc_s.so.1",host-name="/lib/x86_64-linux-gnu/libgcc_s.so.1",symbols-loaded="0",thread-group="i1"
=library-loaded,id="/lib/x86_64-linux-gnu/libc.so.6",target-name="/lib/x86_64-linux-gnu/libc.so.6",host-name="/lib/x86_64-linux-gnu/libc.so.6",symbols-loaded="0",thread-group="i1"
=breakpoint-modified,bkpt={number="2",type="breakpoint",disp="del",enabled="y",addr="0x0000000000400906",func="main()",file="stl_test.cpp",fullname="/home/honza/dev/test/stl_test/stl_test.cpp",line="6",thread-groups=["i1"],times="1",original-location="main"}
*stopped,reason="breakpoint-hit",disp="del",bkptno="2",frame={addr="0x0000000000400906",func="main",args=[],file="stl_test.cpp",fullname="/home/honza/dev/test/stl_test/stl_test.cpp",line="6"},thread-id="1",stopped-threads="all",core="0"
=breakpoint-deleted,id="2"
(gdb) 
&"\n"
^done
(gdb) 
^done,name="var1",numchild="0",value="{...}",type="std::list<int, std::allocator<int> >",thread-id="1",dynamic="1",has_more="1"
(gdb) 
^done,name="var2",numchild="0",value="{...}",type="std::list<int, std::allocator<int> >",thread-id="1",dynamic="1",has_more="1"
(gdb) 
^done,numchild="1",children=[child={name="var2.<error at 0>",exp="<error at 0>",numchild="35",type="char [35]",thread-id="1"}],has_more="0"
(gdb) 
^running
*running,thread-id="all"
(gdb) 
=breakpoint-modified,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x0000000000400952",func="main()",file="stl_test.cpp",fullname="/home/honza/dev/test/stl_test/stl_test.cpp",line="12",thread-groups=["i1"],times="1",original-location="/home/honza/dev/test/stl_test/stl_test.cpp:12"}
*stopped,reason="breakpoint-hit",disp="keep",bkptno="1",frame={addr="0x0000000000400952",func="main",args=[],file="stl_test.cpp",fullname="/home/honza/dev/test/stl_test/stl_test.cpp",line="12"},thread-id="1",stopped-threads="all",core="0"
(gdb) 
&"\n"
^done
(gdb) 

~"varobj.c:3532: internal-error: c_value_of_variable: Assertion `!value_lazy (var->value)' failed.\nA problem internal to GDB has been detected,\nfurther debugging may prove unreliable.\nQuit this debugging session? "
~"(y or n) "
n
~"varobj.c:3532: internal-error: c_value_of_variable: Assertion `!value_lazy (var->value)' failed.\nA problem internal to GDB has been detected,\nfurther debugging may prove unreliable.\nCreate a core file of GDB? "
~"(y or n) "
Comment 5 Serge Roussak 2021-09-15 07:02:06 UTC
This bug is reproduced on my machine too. I use the Eclipse CDT IDE and this bug may break the debugging because the gdb is crashed sometimes with exactly the same symptoms as described here and the same assertion is logged on the gdb trace console. I tried the different Eclipse CDT, gcc and gdb versions -- the bug is here.
Comment 6 Tom Tromey 2022-06-07 15:36:32 UTC
I tried this recently and was also unable to reproduce.
At the same time I don't really see why that assertion
should even be there.  Either the value should automatically
un-lazy, or we could just explicitly un-lazy it at that point.
Comment 7 Tom Tromey 2023-08-31 19:21:24 UTC
Tried again and I still can't reproduce.  Tried gdb git master.
I'm going to close this; but if someone has more
info and can still reproduce, please reopen.