Built-in variables are included in the output to the set command. ($0 and $@ aren't variables at all, even special ones, so they aren't included -- but $_, $BASH_ALIASES, $BASH_SOURCE, $BASH_VERSINFO, $DIRSTACK, $PPID, and all the other things that are built-in variables are present).
$0, $*, $@, etc. are not built-in variables; they are special parameters instead. Semantics are quite different (you can use declare -p to print a variable's value, but not that of a special parameter; many built-in variables lose their special behavior if reassigned, whereas special parameters can never be the target of an assignment; etc).
http://wiki.bash-hackers.org/syntax/shellvars covers both built-in variables and special parameters.
If your goal is to generate a log of current shell state, I suggest the following:
(set; set -x; : "$0" "$@") &>trace.log
set dumps the things that are actually built-in variables (including $_), and the set -x log of running : "$0" "$@" will contain enough information to reproduce all special parameters which are based on your positional parameters ("$*", "$@", etc); whereas the output from set will include all other state.