If you don't have VS2010, you can use PostSharp to weave in code to collect parameters as functions are called. It will slow down code, though, so it's only useful for debugging.
EDIT: (promoting this from a comment I just made)
If you want to use this in production, you can either limit the scope of the PostSharp weaving, so it only operates on certain classes/namespaces/assemblies (or even functions), or you can limit what you do when your advice is executed. One thing I tried, but didn't fully follow through on, was to have the advice methods simply record stack frame information in a ring buffer. When an exception occurs, your logger can grab the stack frame information from the ring buffer and generate a suitable log message. Otherwise, the frame information is just overwritten as the ring buffer fills up. You could even just use a stack instead of a ring buffer and have that stack grow and shrink, recording frame info, as the call stack grows and shrinks. Caveat: you won't be able to get frame information from framework code or 3rd party code that can't be modified by PostSharp.