I would like someone to look at this and tell me this is an already
fixed bug. Or that recent GCC patches may have fixed it. :-)
Or it would also be great to get some advice on building a reproducer
without needing to include many megabytes of proprietary code plus Boost.
I've been using Fedora 24 Alpha and of course I've somehow managed to
write some C++ code even more confusing for GCC than Firefox. Heh.
The problem is a crash when std::string tries to free memory from a
temporary std::string that was bound to a const reference.
And it only crashes when I pass -O2 or -O3 and the -fprofile-generate flags.
$ gcc -v
Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/6.0.0/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap
--enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared
--enable-threads=posix --enable-checking=release --enable-multilib
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-gnu-unique-object --enable-linker-build-id
--with-linker-hash-style=gnu --enable-plugin --enable-initfini-array
--disable-libgcj --with-isl --enable-libmpx
--enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686
--build=x86_64-redhat-linux
Thread model: posix
gcc version 6.0.0 20160406 (Red Hat 6.0.0-0.20) (GCC)
I collected my findings so far into the attachment.
Thanks for reading!
--
Knowledge is Power -- Power Corrupts
Study Hard -- Be Evil
====
I am working at reducing this to a test case but it is slow going. It seems
quite sensitive to how much exists in the headers and templates.
The cxxtest code snippit that I am showing in the assembly code below is:
static const char* udbname = "urldb-import";
static const char* tname = "tmpmapfile";
class TestURLDatabase_1_Delete : public CxxTest::TestSuite {
public:
void setUp()
{
remove(udbname);
}
void testDelete1()
{
eSoft::URLDatabaseReaderWriter_1 dbw(udbname);
dbw.insert_compress_word("esoft", 1);
dbw.insert_url("esoft.com", 0x0AAAAAAAU);
TS_ASSERT_EQUALS( dbw.lookup("esoft.com"), 0x0AAAAAAAU );
dbw.remove_url("esoft.com");
TS_ASSERT_EQUALS( dbw.lookup("esoft.com"), 0U );
}
[... rest of tests snipped ...]
The constructor call looks like:
URLDatabaseReaderWriter_1(const std::string &fname, const std::string &id =
URLDatabaseReader_1::identifier())
So it ends up generating two temporary std::strings.
====
Assembly code showing the problem I am having with GCC 6.0 and the C++11 ABI
std::string. For some reason, in this function, a temporary std::string
allocated for a conversion from a const char* to const std::string& is being
deleted twice. Once right after the constructor function that is using the
temporary string, and again at function exit, probably to cover the case if the
constructor throws. The second delete thinks it is using allocated storage
instead of local.
These are sections of objdump -dCr output.
Without -fprofile-generate. Note that at 0x99 %rbx is reloaded from %rax (the
result of identifier() I think) and it is then used at 0xb3 to determine if
std::string is using local storage or allocated storage. This seems to work and
both temporary strings are properly destroyed.
=====
Disassembly of section .text._ZN24TestURLDatabase_1_Delete11testDelete1Ev:
0000000000000000 <TestURLDatabase_1_Delete::testDelete1()>:
0: 41 54 push %r12
2: 55 push %rbp
3: 53 push %rbx
4: 48 81 ec 30 02 00 00 sub $0x230,%rsp
b: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
12: 00 00
14: 48 89 84 24 28 02 00 mov %rax,0x228(%rsp)
1b: 00
1c: 31 c0 xor %eax,%eax
1e: e8 00 00 00 00 callq 23
<TestURLDatabase_1_Delete::testDelete1()+0x23>
1f: R_X86_64_PLT32
eSoft::URLDatabaseReader_1::identifier[abi:cxx11]()-0x4
23: 49 89 c4 mov %rax,%r12
26: 48 89 e3 mov %rsp,%rbx
29: 48 8d 44 24 10 lea 0x10(%rsp),%rax
2e: 48 89 04 24 mov %rax,(%rsp)
32: 48 8d 15 00 00 00 00 lea 0x0(%rip),%rdx # 39
<TestURLDatabase_1_Delete::testDelete1()+0x39>
35: R_X86_64_PC32 .LC0+0x8
39: 48 8d 35 00 00 00 00 lea 0x0(%rip),%rsi # 40
<TestURLDatabase_1_Delete::testDelete1()+0x40>
3c: R_X86_64_PC32 .LC0-0x4
40: 48 89 e7 mov %rsp,%rdi
43: e8 00 00 00 00 callq 48
<TestURLDatabase_1_Delete::testDelete1()+0x48>
44: R_X86_64_PC32
.text._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPcEEvT_S7_St20forward_iterator_tag.isra.57-0x4
48: 48 8d 6c 24 20 lea 0x20(%rsp),%rbp
4d: 4c 89 e2 mov %r12,%rdx
50: 48 89 e6 mov %rsp,%rsi
53: 48 89 ef mov %rbp,%rdi
56: e8 00 00 00 00 callq 5b
<TestURLDatabase_1_Delete::testDelete1()+0x5b>
57: R_X86_64_PLT32
eSoft::URLDatabaseReaderWriter_1::URLDatabaseReaderWriter_1(std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&,
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
const&)-0x4
5b: 48 8b 3c 24 mov (%rsp),%rdi
5f: 48 83 c3 10 add $0x10,%rbx
63: 48 39 df cmp %rbx,%rdi
66: 74 05 je 6d
<TestURLDatabase_1_Delete::testDelete1()+0x6d>
68: e8 00 00 00 00 callq 6d
<TestURLDatabase_1_Delete::testDelete1()+0x6d>
69: R_X86_64_PLT32 operator delete(void*)-0x4
6d: 48 8d 7d 08 lea 0x8(%rbp),%rdi
71: ba 01 00 00 00 mov $0x1,%edx
76: 48 8d 35 00 00 00 00 lea 0x0(%rip),%rsi # 7d
<TestURLDatabase_1_Delete::testDelete1()+0x7d>
79: R_X86_64_PC32 .LC20-0x4
7d: e8 00 00 00 00 callq 82
<TestURLDatabase_1_Delete::testDelete1()+0x82>
7e: R_X86_64_PLT32
eSoft::URLDatabaseWriter_1::insert_compress_word(char const*, unsigned int)-0x4
82: 48 8d 7d 08 lea 0x8(%rbp),%rdi
86: 31 c9 xor %ecx,%ecx
88: ba aa aa aa 0a mov $0xaaaaaaa,%edx
8d: 48 8d 35 00 00 00 00 lea 0x0(%rip),%rsi # 94
<TestURLDatabase_1_Delete::testDelete1()+0x94>
90: R_X86_64_PC32 .LC21-0x4
94: e8 00 00 00 00 callq 99
<TestURLDatabase_1_Delete::testDelete1()+0x99>
95: R_X86_64_PLT32
eSoft::URLDatabaseWriter_1::insert_url(char const*, unsigned int, unsigned
short)-0x4
99: 48 89 c3 mov %rax,%rbx
9c: 48 89 ef mov %rbp,%rdi
9f: e8 00 00 00 00 callq a4
<TestURLDatabase_1_Delete::testDelete1()+0xa4>
a0: R_X86_64_PC32
eSoft::URLDatabaseReaderWriter_1::~URLDatabaseReaderWriter_1()-0x4
a4: 48 89 df mov %rbx,%rdi
a7: e8 00 00 00 00 callq ac
<TestURLDatabase_1_Delete::testDelete1()+0xac>
a8: R_X86_64_PLT32 _Unwind_Resume-0x4
ac: 48 89 c5 mov %rax,%rbp
af: 48 8b 3c 24 mov (%rsp),%rdi
b3: 48 83 c3 10 add $0x10,%rbx
b7: 48 39 df cmp %rbx,%rdi
ba: 74 05 je c1
<TestURLDatabase_1_Delete::testDelete1()+0xc1>
bc: e8 00 00 00 00 callq c1
<TestURLDatabase_1_Delete::testDelete1()+0xc1>
bd: R_X86_64_PLT32 operator delete(void*)-0x4
c1: 48 89 ef mov %rbp,%rdi
c4: e8 00 00 00 00 callq c9 <.LC84>
c5: R_X86_64_PLT32 _Unwind_Resume-0x4
====
With -fprofile-generate.
You can see by searching that register %rbx which has 0x10 added at 0x1a1 never
got reloaded since it was used to destroy the first temporary string. Which
means that it gets 0x10 added twice. The second time makes the comparison fail
and std::string thinks it needs to deallocate memory, which of course goes
horribly wrong.
====
0000000000000000 <TestURLDatabase_1_Delete::testDelete1()>:
0: 41 54 push %r12
2: 55 push %rbp
3: 53 push %rbx
4: 48 81 ec 30 02 00 00 sub $0x230,%rsp
b: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
12: 00 00
14: 48 89 84 24 28 02 00 mov %rax,0x228(%rsp)
1b: 00
1c: 31 c0 xor %eax,%eax
1e: 48 8d 35 00 00 00 00 lea 0x0(%rip),%rsi # 25
<TestURLDatabase_1_Delete::testDelete1()+0x25>
21: R_X86_64_PC32
TestURLDatabase_1_Delete::testDelete1()-0x4
25: bf ab 17 6b 50 mov $0x506b17ab,%edi
2a: e8 00 00 00 00 callq 2f
<TestURLDatabase_1_Delete::testDelete1()+0x2f>
2b: R_X86_64_PLT32
__gcov_indirect_call_profiler_v2-0x4
2f: 66 48 8d 3d 00 00 00 data16 lea 0x0(%rip),%rdi # 37
<TestURLDatabase_1_Delete::testDelete1()+0x37>
36: 00
33: R_X86_64_TLSGD __gcov_indirect_call_callee-0x4
37: 66 66 48 e8 00 00 00 data16 data16 callq 3f
<TestURLDatabase_1_Delete::testDelete1()+0x3f>
3e: 00
3b: R_X86_64_PLT32 __tls_get_addr-0x4
3f: 48 c7 00 00 00 00 00 movq $0x0,(%rax)
46: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 4e
<TestURLDatabase_1_Delete::testDelete1()+0x4e>
4d: 01
49: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev-0x5
4e: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 55
<TestURLDatabase_1_Delete::testDelete1()+0x55>
51: R_X86_64_PC32
.bss.__gcov8._ZN24TestURLDatabase_1_Delete11testDelete1Ev-0x4
55: e8 00 00 00 00 callq 5a
<TestURLDatabase_1_Delete::testDelete1()+0x5a>
56: R_X86_64_PLT32 __gcov_time_profiler-0x4
5a: e8 00 00 00 00 callq 5f
<TestURLDatabase_1_Delete::testDelete1()+0x5f>
5b: R_X86_64_PLT32
eSoft::URLDatabaseReader_1::identifier[abi:cxx11]()-0x4
5f: 49 89 c4 mov %rax,%r12
62: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 6a
<TestURLDatabase_1_Delete::testDelete1()+0x6a>
69: 01
65: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x3
6a: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 71
<TestURLDatabase_1_Delete::testDelete1()+0x71>
6d: R_X86_64_PC32
.bss.__gcov8._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS3_.isra.50-0x4
71: e8 00 00 00 00 callq 76
<TestURLDatabase_1_Delete::testDelete1()+0x76>
72: R_X86_64_PLT32 __gcov_time_profiler-0x4
76: 48 89 e3 mov %rsp,%rbx
79: 48 8d 44 24 10 lea 0x10(%rsp),%rax
7e: 48 89 04 24 mov %rax,(%rsp)
82: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 8a
<TestURLDatabase_1_Delete::testDelete1()+0x8a>
89: 01
85: R_X86_64_PC32
.bss.__gcov0._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS3_.isra.50-0x5
8a: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 91
<TestURLDatabase_1_Delete::testDelete1()+0x91>
8d: R_X86_64_PC32
.bss.__gcov8._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag.isra.48-0x4
91: e8 00 00 00 00 callq 96
<TestURLDatabase_1_Delete::testDelete1()+0x96>
92: R_X86_64_PLT32 __gcov_time_profiler-0x4
96: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 9e
<TestURLDatabase_1_Delete::testDelete1()+0x9e>
9d: 01
99: R_X86_64_PC32
.bss.__gcov0._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag.isra.48+0x3
9e: 48 8b 2c 24 mov (%rsp),%rbp
a2: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # aa
<TestURLDatabase_1_Delete::testDelete1()+0xaa>
a9: 01
a5: R_X86_64_PC32
.bss.__gcov0._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag.isra.48+0x23
aa: be 0c 00 00 00 mov $0xc,%esi
af: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # b6
<TestURLDatabase_1_Delete::testDelete1()+0xb6>
b2: R_X86_64_PC32
.bss.__gcov3._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag.isra.48-0x4
b6: e8 00 00 00 00 callq bb
<TestURLDatabase_1_Delete::testDelete1()+0xbb>
b7: R_X86_64_PLT32 __gcov_one_value_profiler-0x4
bb: be 0c 00 00 00 mov $0xc,%esi
c0: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # c7
<TestURLDatabase_1_Delete::testDelete1()+0xc7>
c3: R_X86_64_PC32
.bss.__gcov6._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag.isra.48-0x4
c7: e8 00 00 00 00 callq cc
<TestURLDatabase_1_Delete::testDelete1()+0xcc>
c8: R_X86_64_PLT32 __gcov_average_profiler-0x4
cc: 48 89 ee mov %rbp,%rsi
cf: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # d6
<TestURLDatabase_1_Delete::testDelete1()+0xd6>
d2: R_X86_64_PC32
.bss.__gcov7._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag.isra.48-0x4
d6: e8 00 00 00 00 callq db
<TestURLDatabase_1_Delete::testDelete1()+0xdb>
d7: R_X86_64_PLT32 __gcov_ior_profiler-0x4
db: 48 b8 75 72 6c 64 62 movabs $0x6d692d62646c7275,%rax
e2: 2d 69 6d
e5: 48 89 45 00 mov %rax,0x0(%rbp)
e9: c7 45 08 70 6f 72 74 movl $0x74726f70,0x8(%rbp)
f0: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # f8
<TestURLDatabase_1_Delete::testDelete1()+0xf8>
f7: 01
f3: R_X86_64_PC32
.bss.__gcov0._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE12_M_constructIPKcEEvT_S8_St20forward_iterator_tag.isra.48+0x33
f8: 48 c7 44 24 08 0c 00 movq $0xc,0x8(%rsp)
ff: 00 00
101: 48 8b 04 24 mov (%rsp),%rax
105: c6 40 0c 00 movb $0x0,0xc(%rax)
109: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 111
<TestURLDatabase_1_Delete::testDelete1()+0x111>
110: 01
10c: R_X86_64_PC32
.bss.__gcov0._ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC2EPKcRKS3_.isra.50+0xb
111: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 119
<TestURLDatabase_1_Delete::testDelete1()+0x119>
118: 01
114: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0xb
119: 48 8d 6c 24 20 lea 0x20(%rsp),%rbp
11e: 4c 89 e2 mov %r12,%rdx
121: 48 89 e6 mov %rsp,%rsi
124: 48 89 ef mov %rbp,%rdi
127: e8 00 00 00 00 callq 12c
<TestURLDatabase_1_Delete::testDelete1()+0x12c>
128: R_X86_64_PLT32
eSoft::URLDatabaseReaderWriter_1::URLDatabaseReaderWriter_1(std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&,
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >
const&)-0x4
12c: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 134
<TestURLDatabase_1_Delete::testDelete1()+0x134>
133: 01
12f: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x1b
134: 48 8b 3c 24 mov (%rsp),%rdi
138: 48 83 c3 10 add $0x10,%rbx
13c: 48 39 df cmp %rbx,%rdi
13f: 74 15 je 156
<TestURLDatabase_1_Delete::testDelete1()+0x156>
141: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 149
<TestURLDatabase_1_Delete::testDelete1()+0x149>
148: 01
144: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x23
149: e8 00 00 00 00 callq 14e
<TestURLDatabase_1_Delete::testDelete1()+0x14e>
14a: R_X86_64_PLT32 operator delete(void*)-0x4
14e: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 156
<TestURLDatabase_1_Delete::testDelete1()+0x156>
155: 01
151: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x2b
156: 48 8d 7d 08 lea 0x8(%rbp),%rdi
15a: ba 01 00 00 00 mov $0x1,%edx
15f: 48 8d 35 00 00 00 00 lea 0x0(%rip),%rsi # 166
<TestURLDatabase_1_Delete::testDelete1()+0x166>
162: R_X86_64_PC32 .LC52-0x4
166: e8 00 00 00 00 callq 16b
<TestURLDatabase_1_Delete::testDelete1()+0x16b>
167: R_X86_64_PLT32
eSoft::URLDatabaseWriter_1::insert_compress_word(char const*, unsigned int)-0x4
16b: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 173
<TestURLDatabase_1_Delete::testDelete1()+0x173>
172: 01
16e: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x3b
173: 48 8d 7d 08 lea 0x8(%rbp),%rdi
177: 31 c9 xor %ecx,%ecx
179: ba aa aa aa 0a mov $0xaaaaaaa,%edx
17e: 48 8d 35 00 00 00 00 lea 0x0(%rip),%rsi # 185
<TestURLDatabase_1_Delete::testDelete1()+0x185>
181: R_X86_64_PC32 .LC53-0x4
185: e8 00 00 00 00 callq 18a
<TestURLDatabase_1_Delete::testDelete1()+0x18a>
186: R_X86_64_PLT32
eSoft::URLDatabaseWriter_1::insert_url(char const*, unsigned int, unsigned
short)-0x4
18a: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 192
<TestURLDatabase_1_Delete::testDelete1()+0x192>
191: 01
18d: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x4b
192: 48 89 c5 mov %rax,%rbp
195: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 19d
<TestURLDatabase_1_Delete::testDelete1()+0x19d>
19c: 01
198: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x13
19d: 48 8b 3c 24 mov (%rsp),%rdi
1a1: 48 83 c3 10 add $0x10,%rbx
1a5: 48 39 df cmp %rbx,%rdi
1a8: 74 15 je 1bf
<TestURLDatabase_1_Delete::testDelete1()+0x1bf>
1aa: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 1b2
<TestURLDatabase_1_Delete::testDelete1()+0x1b2>
1b1: 01
1ad: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x53
1b2: e8 00 00 00 00 callq 1b7
<TestURLDatabase_1_Delete::testDelete1()+0x1b7>
1b3: R_X86_64_PLT32 operator delete(void*)-0x4
1b7: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 1bf
<TestURLDatabase_1_Delete::testDelete1()+0x1bf>
1be: 01
1ba: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x5b
1bf: 48 89 ef mov %rbp,%rdi
1c2: e8 00 00 00 00 callq 1c7
<TestURLDatabase_1_Delete::testDelete1()+0x1c7>
1c3: R_X86_64_PLT32 _Unwind_Resume-0x4
1c7: 48 89 c3 mov %rax,%rbx
1ca: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 1d2
<TestURLDatabase_1_Delete::testDelete1()+0x1d2>
1d1: 01
1cd: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x43
1d2: 48 89 ef mov %rbp,%rdi
1d5: e8 00 00 00 00 callq 1da
<TestURLDatabase_1_Delete::testDelete1()+0x1da>
1d6: R_X86_64_PC32
eSoft::URLDatabaseReaderWriter_1::~URLDatabaseReaderWriter_1()-0x4
1da: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 1e2
<TestURLDatabase_1_Delete::testDelete1()+0x1e2>
1e1: 01
1dd: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x63
1e2: 48 89 df mov %rbx,%rdi
1e5: e8 00 00 00 00 callq 1ea
<TestURLDatabase_1_Delete::testDelete1()+0x1ea>
1e6: R_X86_64_PLT32 _Unwind_Resume-0x4
1ea: 48 89 c3 mov %rax,%rbx
1ed: 48 83 05 00 00 00 00 addq $0x1,0x0(%rip) # 1f5
<TestURLDatabase_1_Delete::testDelete1()+0x1f5>
1f4: 01
1f0: R_X86_64_PC32
.bss.__gcov0._ZN24TestURLDatabase_1_Delete11testDelete1Ev+0x33
1f5: eb db jmp 1d2
<TestURLDatabase_1_Delete::testDelete1()+0x1d2>