Reputation: 162289
Is there a straigtforward way with ready-at-hand tooling to suspend a traced process' execution when a certain syscalls are called with specific parameters? Specifically I want to suspend program execution whenever
stat("/${SOME_PATH}")
or
readlink("/${SOME_PATH}")
are called. I aim to then attach a debugger, so that I can identify which of the hundreds of shared objects that are linked into the process is trying to access that specific path.
strace
shows me the syscalls alright, and gdb
does the rest. The question is, how to bring them together. This surely can be solved with custom glue-scripting, but I'd rather use a clean solution.
The problem at hand is a 3rd party toolsuite which is available only in binary form and which distribution package completely violates the LSB/FHS and good manners and places shared objects all over the filesystem, some of which are loaded from unconfigurable paths. I'd like to identify which modules of the toolsuite try to do this and either patch the binaries or to file an issue with the vendor.
Upvotes: 0
Views: 654
Reputation: 9173
This is the approach that I use for similar condition in windows debugging. Even though I think it should be possible for you too, I have not tried it with gdb
in linux.
stat
in your case.esp
to your breakpoint. For example you want to check stat("/$te")
. value at [esp+4]
should point to address of string which in this case is "/$te"
. Then add a condition like: *(uint32_t*)[esp+4] == "/$te"
. It seems that you can use strcmp()
in your condition too as described here.I think something similar to this should work for you too.
Upvotes: 1