Dwarf-Therapist icon indicating copy to clipboard operation
Dwarf-Therapist copied to clipboard

DT closes and reopens DF memory for every read/write

Open Hello71 opened this issue 11 years ago • 5 comments

This seems inefficient:

$ strace -fe open,close bin/release/DwarfTherapist
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0
[pid  9459] open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 11
[pid  9459] close(11)                   = 0

and on and on for hundreds of thousands of pages

Hello71 avatar Aug 03 '14 14:08 Hello71

related:

[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0
[pid 12084] ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
[pid 12084] ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0

and on and on around 60000 times (just to attach, mind you)

Hello71 avatar Aug 03 '14 14:08 Hello71

strace -f DwarfTherapist generates a 128 MiB file just to start and attach to DF, running over 2 million system calls.

that explains why DT takes forever to start, when it should start faster than on Windows.

Hello71 avatar Aug 03 '14 14:08 Hello71

12275 ptrace(PTRACE_ATTACH, 8816, 0, 0) = 0
12275 wait4(8816, [{WIFSTOPPED(s) && WSTOPSIG(s) == SIGSTOP}], 0, NULL) = 8816
12275 open("/proc/8816/mem", O_RDONLY|O_CLOEXEC) = 14
12275 fcntl(14, F_SETFD, FD_CLOEXEC)    = 0
12275 fstat(14, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
12275 lseek(14, 4077169824, SEEK_SET)   = 4077169824
12275 read(14, "\314TA\363<\\A\363\264YA\363\264YA\363\264YA\363\334[A\363,YA\363T\\A\363"..., 16384) = 16384
12275 close(14)                         = 0
12275 ptrace(PTRACE_DETACH, 8816, 0, SIG_0) = 0

to read 16 KiB.

Hello71 avatar Aug 03 '14 14:08 Hello71

#73 helps a lot since now only one system call needs to be made instead of nine; it would still be a good idea to simply read in the required data instead of reading it in 2-4 bytes at a time.

Hello71 avatar Aug 03 '14 20:08 Hello71

#150 fixes a lot of this on Windows by reading vectors in a big chunk.

it's probably a good idea to open mem and attach in the DFInstanceLinux constructor.

Hello71 avatar Sep 01 '14 20:09 Hello71