Skip to content

Instantly share code, notes, and snippets.

@ccy
Last active August 27, 2021 02:40
Show Gist options
  • Save ccy/e871b26a7dc0c8c9cf346a3e9aefcb73 to your computer and use it in GitHub Desktop.
Save ccy/e871b26a7dc0c8c9cf346a3e9aefcb73 to your computer and use it in GitHub Desktop.
Debug Access Violation running `EMSDevServerCommand` in Debian on WSL2

Symptom

Access Violation occur when executing `EMSDevServerCommand``for RAD Server on Debian platform:

$ ./EMSDevServerCommand
Exception EAccessViolation in module <unknown> at 0000000000000000.
Access violation at address 0000000000000000, accessing address 0000000000000000.
Tip
A quick solution is install curl.

Check shared libraries with ldd

First, using ldd to show if for missing shared libraries used by EMSDevServerCommand:

$ ldd EMSDevServerCommand
        linux-vdso.so.1 (0x00007ffd4c1f6000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f14bd0a0000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f14bcedf000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f14bceda000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f14bceb9000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f14bcc9b000)
        bplemsserverapi270.so => /usr/lib/ems/./bplemsserverapi270.so (0x00007f14bca71000)
        bplFireDAC270.so => /usr/lib/ems/./bplFireDAC270.so (0x00007f14bc880000)
        bplFireDACIBDriver270.so => /usr/lib/ems/./bplFireDACIBDriver270.so (0x00007f14bc7a3000)
        bplrtl270.so => /usr/lib/ems/./bplrtl270.so (0x00007f14bbb17000)
        bpldbrtl270.so => /usr/lib/ems/./bpldbrtl270.so (0x00007f14bb946000)
        bplFireDACCommon270.so => /usr/lib/ems/./bplFireDACCommon270.so (0x00007f14bb728000)
        bplFireDACCommonDriver270.so => /usr/lib/ems/./bplFireDACCommonDriver270.so (0x00007f14bb597000)
        bplxmlrtl270.so => /usr/lib/ems/./bplxmlrtl270.so (0x00007f14bb01d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f14bd0c0000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f14bae9a000)
        libsqlite3.so.0 => /usr/lib/x86_64-linux-gnu/libsqlite3.so.0 (0x00007f14bad78000)

Apparently, all shared libraries is available in the system.

Diagnose runtime with strace

Next, use strace to debug EMSDevServerCommand at runtime:

# Install strace
$ apt install -y strace

# Launch strace to debug EMSDevServerCommand
$ strace ./EMSDevServerCommand
execve("./EMSDevServerCommand", ["./EMSDevServerCommand"], 0x7ffe5ee80420 /* 18 vars */) = 0
brk(NULL)                               = 0x1b82000
readlink("/proc/self/exe", "/usr/lib/ems/EMSDevServerCommand", 4096) = 32
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...
openat(AT_FDCWD, "/usr/lib/ems/libcurl.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) (1)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
fstat(5, {st_mode=S_IFREG|0644, st_size=15855, ...}) = 0
mmap(NULL, 15855, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7f35b0bfb000
close(5)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libcurl.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libcurl.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/libcurl.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/libcurl.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
munmap(0x7f35b0bfb000, 15855)           = 0
openat(AT_FDCWD, "/usr/lib/ems/libcurl.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
fstat(5, {st_mode=S_IFREG|0644, st_size=15855, ...}) = 0
mmap(NULL, 15855, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7f35b0bfb000
close(5)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libcurl.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libcurl.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/libcurl.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/libcurl.so.4", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
munmap(0x7f35b0bfb000, 15855)           = 0
openat(AT_FDCWD, "/usr/lib/ems/libcurl.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
fstat(5, {st_mode=S_IFREG|0644, st_size=15855, ...}) = 0
mmap(NULL, 15855, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7f35b0bfb000
close(5)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libcurl.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libcurl.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/libcurl.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/libcurl.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
munmap(0x7f35b0bfb000, 15855)           = 0
openat(AT_FDCWD, "/usr/lib/ems/libcurl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 5
fstat(5, {st_mode=S_IFREG|0644, st_size=15855, ...}) = 0
mmap(NULL, 15855, PROT_READ, MAP_PRIVATE, 5, 0) = 0x7f35b0bfb000
close(5)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libcurl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libcurl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/libcurl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/libcurl.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
munmap(0x7f35b0bfb000, 15855)           = 0
futex(0x7f35b0bf81a0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=NULL} ---
rt_sigreturn({mask=[]})                 = 139868565804120
write(2, "Exception EAccessViolation in mo"..., 150Exception EAccessViolation in module <unknown> at 0000000000000000.
Access violation at address 0000000000000000, accessing address 0000000000000000.
) = 150
close(3)                                = 0
close(4)                                = 0
rt_sigaction(SIGINT, NULL, {sa_handler=0x7f35afbd7410, sa_mask=[INT QUIT], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f35b0a55840}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f35b0a55840}, NULL, 8) = 0
rt_sigaction(SIGFPE, NULL, {sa_handler=0x7f35afbd7410, sa_mask=[INT QUIT], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f35b0a55840}, 8) = 0
rt_sigaction(SIGFPE, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f35b0a55840}, NULL, 8) = 0
rt_sigaction(SIGSEGV, NULL, {sa_handler=0x7f35afbd7410, sa_mask=[INT QUIT], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f35b0a55840}, 8) = 0
rt_sigaction(SIGSEGV, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f35b0a55840}, NULL, 8) = 0
rt_sigaction(SIGILL, NULL, {sa_handler=0x7f35afbd7410, sa_mask=[INT QUIT], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f35b0a55840}, 8) = 0
rt_sigaction(SIGILL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f35b0a55840}, NULL, 8) = 0
rt_sigaction(SIGBUS, NULL, {sa_handler=0x7f35afbd7410, sa_mask=[INT QUIT], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f35b0a55840}, 8) = 0
rt_sigaction(SIGBUS, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f35b0a55840}, NULL, 8) = 0
rt_sigaction(SIGQUIT, NULL, {sa_handler=0x7f35afbd7410, sa_mask=[INT QUIT], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f35b0a55840}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f35b0a55840}, NULL, 8) = 0
munmap(NULL, 61439)                     = 0
exit_group(1)                           = ?
+++ exited with 1 +++
  1. libcurl.so is missing

Solution

Installing curl to the system and re-run EMSDevServerCommand:

$ apt install -y curl

$ ./EMSDevServerCommand
RAD Development Server, Version 4.2
Copyright (c) 2009-2020 Embarcadero Technologies, Inc.

Commands:
   - "start" to start the server
   - "stop" to stop the server
   - "set port" to change the default port
   - "log" to show the log
   - "log e" to enable the log
   - "log d" to disable the log
   - "clear" to clear the log
   - "status" for Server status
   - "help" to show commands
   - "q" to quit
>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment