Note that you will never see the output of the cameras Printf event proc (it starts with a capital P) unless you use uart redirection or similar, as described in the wiki page you linked.
The simplest way to call it is to just use call_event_proc("Printf",...) from your lua script. There are some complications calling vararg firmware functions from CHDK thumb code, which is why they aren't exposed directly.
You can hack around this by making your wrapper accept the most arguments you ever expect to use and pass them to the arm function, and then *not* giving any prototype and treating it as a vararg when you call it. This should be OK for printf like functions, as the extra garbage arguments will be ignored. You can also call arm functions directly *if* they return in a thumb safe way like BX LR.
I have no idea why your code crashes, but a romlog might give you some hints.
Here's how I set up LogPrintf in wrappers .c (note, you will have to find the address for your camera and add it to stubs_entry_2.s)
extern void _LogPrintf(int id,const char *fmt,int a,int b, int c, int d);
void LogPrintf(const char *fmt, int a,int b, int c,int d)
{
_LogPrintf(0x120,fmt,a,b,c,d);
}
Then you can call LogPrintf(...) with up to 5 arguments. *do not* make a prototype for LogPrintf in the files you call it from.
LogPrintf goes to the camera log. This is a buffer of recent log entries the camera writes all kinds of stuff to already. If the camera crashes, recent camera log entries are included in the romlog. Otherwise, you will not normally see them. You can also get them to a file, using ShowCameraLog and uart redirection. Note that uart redirection doesn't exist on older cameras (most if not all vxworks).