ASSERT and CRASH with two clients: regression in 8.0
$ cd /work/dr/releases/rel-7.1.0/DynamoRIO-Linux-7.1.0-1
$ bin64/drrun -client samples/bin64/libbbcount.so 0 "" -client samples/bin64/libbbsize.so 1 "" -- ls
Client bbcount is running
Client bbsize is running
ACKNOWLEDGEMENTS bin32 bin64 cmake docs drmemory dynamorio ext include lib32 lib64 License.txt logs README samples tools
Number of basic blocks seen: 4694
Maximum size: 36 instructions
Average size: 4.9 instructions
Instrumentation results:
166909 basic block executions
891 basic blocks needed flag saving
3803 basic blocks did not
But:
$ cd /work/dr/releases/rel-8.0.0/DynamoRIO-Linux-8.0.0-1
$ bin64/drrun -client samples/bin64/libbbcount.so 0 "" -client samples/bin64/libbbsize.so 1 "" -- ls
<Application /usr/bin/ls (552079). DynamoRIO internal crash at PC 0x000000007113730d. Please report this at http://dynamorio.org/issues/. Program aborted.
Received SIGSEGV at unknown pc 0x000000007113730d in thread 552079
Base: 0x0000000071000000
Registers:eax=0x00007fe32d851860 ebx=0x00007fe32d85cc80 ecx=0x00007ffe34cfca1f edx=0x00007fe3ae08d8aa
esi=0x00007fe3ae08b6e8 edi=0x0000000000000000 esp=0x00007ffe34cfca10 ebp=0x0000000000000000
r8 =0x000000000000118e r9 =0x0000000000000007 r10=0x0000000000000043 r11=0x0000000000217a08
r12=0x00007fe3ae08d8aa r13=0x00007fe32d851860 r14=0x00007ffe34cfca1f r15=0x0000000000000000
eflags=0x0000000000010206
version 8.0.0, build 1
-no_dynamic_options -client_lib '/work/dr/releases/rel-7.1.0/DynamoRIO-Linux-7.1.0-1/rel-8.0.0/DynamoRIO-Linux-8.0.0-1/samples/bin64/libbbcount.so;0;;/work/dr/releases/rel-7.1.0/DynamoRIO-Linux-7.1.0-1/rel-8.0.0/DynamoRIO-Linux-8.0.0-1/samples/bin64/libbbsize.so;1;' -code_api -stack_size 56K -signal_stack_size 32K -max_e
0x00000000713d849d 0x6974706f5f63696d>
Debug build reports this assert:
#6 0x00000000710dc095 in d_r_internal_error (file=0x713983c8 "/home/travis/build/DynamoRIO/dynamorio/core/unix/module_elf.c", line=1131,
expr=0x7139919b "pd != NULL && name != NULL") at /home/travis/build/DynamoRIO/dynamorio/core/utils.c:176
#7 0x00000000712f7445 in module_lookup_symbol (sym=0x7fffb47889a8, pd=0x0) at /home/travis/build/DynamoRIO/dynamorio/core/unix/module_elf.c:1131
#8 0x00000000712f8616 in module_relocate_symbol (rel=0x7fffb478ab08, pd=0x7fff33f5cf30, is_rela=true)
at /home/travis/build/DynamoRIO/dynamorio/core/unix/module_elf.c:1523
#9 0x00000000712f888a in module_relocate_rela (modbase=0x7fffb4788000 "\177ELF\002\001\001", pd=0x7fff33f5cf30, start=0x7fffb478aaf0,
end=0x7fffb478b330) at /home/travis/build/DynamoRIO/dynamorio/core/unix/module_elf.c:1595
#10 0x00000000712edee6 in privload_relocate_os_privmod_data (opd=0x7fff33f5cf30, mod_base=0x7fffb4788000 "\177ELF\002\001\001")
at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:1125
#11 0x00000000712ee0ae in privload_relocate_mod (mod=0x7fff33f5ccf8) at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:1159
#12 0x00000000712ec614 in privload_process_imports (mod=0x7fff33f5ccf8) at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:587
#13 0x00000000711d8fe8 in privload_load_process (privmod=0x7fff33f5ccf8) at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:827
#14 0x00000000711d889f in privload_load (filename=0x7fffffffb710 "/home/bruening/dr/releases/DynamoRIO-Linux-8.0.0-1/ext/lib64/debug/libdrmgr.so",
dependent=0x7fff33f5c798, client=true) at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:695
#15 0x00000000712ecbc9 in privload_locate_and_load (impname=0x7fffb457cbcf "libdrmgr.so", dependent=0x7fff33f5c798, reachable=true)
at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:682
#16 0x00000000712ec5b3 in privload_process_imports (mod=0x7fff33f5c798) at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:567
#17 0x00000000711d8fe8 in privload_load_process (privmod=0x7fff33f5c798) at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:827
#18 0x00000000711d889f in privload_load (filename=0x7fffffffba20 "/home/bruening/dr/releases/DynamoRIO-Linux-8.0.0-1/ext/lib64/debug/libdrreg.so",
dependent=0x7fff33f5c238, client=true) at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:695
#19 0x00000000712ecbc9 in privload_locate_and_load (impname=0x7fffb436a855 "libdrreg.so", dependent=0x7fff33f5c238, reachable=true)
at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:682
#20 0x00000000712ec5b3 in privload_process_imports (mod=0x7fff33f5c238) at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:567
#21 0x00000000711d8fe8 in privload_load_process (privmod=0x7fff33f5c238) at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:827
#22 0x00000000711d889f in privload_load (filename=0x7fffffffbd30 "/home/bruening/dr/releases/DynamoRIO-Linux-8.0.0-1/ext/lib64/debug/libdrx.so",
dependent=0x7fff33f4a308, client=true) at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:695
#23 0x00000000712ecbc9 in privload_locate_and_load (impname=0x7fffb411d839 "libdrx.so", dependent=0x7fff33f4a308, reachable=true)
at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:682
#24 0x00000000712ec5b3 in privload_process_imports (mod=0x7fff33f4a308) at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:567
#25 0x00000000711d8fe8 in privload_load_process (privmod=0x7fff33f4a308) at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:827
#26 0x00000000711d7169 in privload_process_early_mods () at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:141
#27 0x00000000711d7346 in loader_init_epilogue (dcontext=0x7fff33f56f40) at /home/travis/build/DynamoRIO/dynamorio/core/loader_shared.c:211
#28 0x0000000071052844 in dynamorio_app_init () at /home/travis/build/DynamoRIO/dynamorio/core/dynamo.c:638
#29 0x00000000712efc4d in privload_early_inject (sp=0x7fffffffdd10,
old_libdr_base=0x7ffff797f000 <error: Cannot access memory at address 0x7ffff797f000>, old_libdr_size=6815744)
at /home/travis/build/DynamoRIO/dynamorio/core/unix/loader.c:2012
Along with fixing this, we need to add a test of multiple clients. We have tests of registering multiple clients but apparently not of running multiple clients which is a little surprising. OTOH this is a rarely used feature these days: instead we refactor clients into libraries for explicit coordination.