When I start evolution (mail user agent) in a "ssh -X" session (i.e.,
with X forwarding), the ssh session does not terminate even I have
terminated both evolution and the shell.

I find that there is a process "dbus-launch" running, that keeps a
connection to the remote X server through the ssh forwarding. This
process has parent process 1, and no attached terminal. It is very
cumbersome to track it down and kill it before I exit the shell,
especially if there are other dbus-launch instances not related to my
ssh/evolution session.

Is there any easy way?

I have tried "~.", but that makes my local terminal hang, and I have
to open another local terminal to kill the ssh process.
I have tried "~&", but that leaves the ssh process running in the
background for ever.

I also tried

local> ssh -X -l dbus-lauch --exit-with-session
evolution &

but when I closed evolution, ssh still ran until I killed it.

However, this works reasonably well, if I only remember to do it that

local> ssh -X -l
remote> dbus-launch --exit-with-session evolution &
... # terminate evolution
remote> exit

I can probably write a script to handle the messy details. However, it
still feels strange that there is no way to tell the ssh client that I
want to terminate the connection including all X connections. Have I
missed something?

Besides, should I report as a bug that evolution does not kill dbus-
launch on exit? (I could not even confirm that it is evo that starts
dbus-launch. I tried to run evolution under strace, but got a couple
of "PANIC" messages from strace about subprocesses exiting before
strace managed to attach (if that is what the messages meant).