This big application is issuing external commands via a shell, using
popen or similar library functions. The intermediate shells remain as zombies (“defunct processes”) because the application isn't calling
wait to “reap” its children. Note that zombie processes are totally harmless (no matter what B-movies might lead you to believe); the only resource they consume is an entry in the process table.
You can trace what commands the application executes by running
strace -f -s99999 -v -eexecve -o big-application.strace ./big-application
This may slow down your program somewhat. You can switch tracing on and off during the lifetime of a process: to start tracing, run
strace -f -s99999 -v -eexecve -o big-application.strace -p 12345
where 12345 is the process ID you want to trace. Kill the
strace process (e.g. by pressing Ctrl+C) to stop tracing.