Обсуждение: Using fmgr_hook
Hello, In the process of implementing my own version of sysdate, i was trying to use the fmgr_hook. I had a look at the sepgsql contrib module and tried to do the same by modifying auto_explain just to test using fmgr_hook. My code changes are: static needs_fmgr_hook_type prev_needs_fmgr_hook = NULL; static fmgr_hook_type prev_fmgr_hook = NULL; static bool custom_needs_fmgr_hook(Oid functionId); static void custom_fmgr_hook(FmgrHookEventType event,FmgrInfo *flinfo, Datum *private); in PG_init(void) prev_needs_fmgr_hook = needs_fmgr_hook; needs_fmgr_hook = custom_needs_fmgr_hook; prev_fmgr_hook = fmgr_hook; fmgr_hook = custom_fmgr_hook; in _PG_fini(void) needs_fmgr_hook=prev_needs_fmgr_hook; fmgr_hook=prev_fmgr_hook; static bool custom_needs_fmgr_hook(Oid functionId) { return true; } void custom_fmgr_hook(FmgrHookEventType event,FmgrInfo *flinfo, Datum *private) { if(flinfo->fn_extra == NULL) { TimestampTz current_timestamp = GetCurrentTimestamp(); flinfo->fn_extra = palloc(sizeof(TimestampTz)); flinfo->fn_extra = (void*) current_timestamp; } } To debug i have a breakpoint inside custom_fmgr_hook. Debugging: 1. Start postgres 2. Start psql connecting to postgres 3. Attach gdb to process spawned off by postmaster representing psql session. 4. execute select * from now(); Problem: The breakpoint seems to get skipped. Just to be sure i put a breakpoint in explain_ExecutorStart and i could debug that function. So i am attaching gdb to correct process. What am i doing wrong? Thank you, Sameer
Sameer Thakur wrote: > In the process of implementing my own version of sysdate, i was trying > to use the fmgr_hook. [...] > To debug i have a breakpoint inside custom_fmgr_hook. > > Debugging: > 1. Start postgres > 2. Start psql connecting to postgres > 3. Attach gdb to process spawned off by postmaster representing psql session. > 4. execute select * from now(); > > Problem: > The breakpoint seems to get skipped. Just to be sure i put a > breakpoint in explain_ExecutorStart and i could debug that function. > So i am attaching gdb to correct process. > What am i doing wrong? My experience is that you cannot set breakpoints before the library is loaded, so you first have to call a function in the library, then you interrupt and set the breakpoint. I don't know if there is a way to get around that with gdb on Linux. Yours, Laurenz Albe
Hello, Thank you for responding >My experience is that you cannot set breakpoints before the library >is loaded, so you first have to call a function in the library, then >you interrupt and set the breakpoint. I tried to do the following 1. Execute Postgres (now auto_explain is loaded) 2. Start a psql session and attach gdb to forked Postmaster process 3. Now set break point in custom_fmgr_hook 4. Execute select * from now(); Still the breakpoint gets skipped. Also i checked by putting a breakpoint in explain_ExecutorStart before starting Postgres (before auto_explain is loaded), and then started psql session, attached gdb and executed select* from now(), in this case the debugger does stop at the breakpoint. The strange thing is i could swear that i had got the debugger to stop in custom_fmgr_hook , just after i added custom_needs_fmgr_hook and had figured out that we need to use custom_needs_fmgr_hook and custom_fmgr_hook together. But i have not been able to reproduce that. So maybe there is something in what you say. I just cannot nail the sequence correctly regards Sameer
Sameer Thakur wrote: >> My experience is that you cannot set breakpoints before the library >> is loaded, so you first have to call a function in the library, then >> you interrupt and set the breakpoint. > I tried to do the following > 1. Execute Postgres (now auto_explain is loaded) > 2. Start a psql session and attach gdb to forked Postmaster process > 3. Now set break point in custom_fmgr_hook > 4. Execute select * from now(); > > Still the breakpoint gets skipped. But gdb tells you that it cannot set the breakpoint correctly when you try to, right? Try like this: - connect with psql - call your custom_fmgr_hook - attach to the backend with gdb - set the breakpoint - call custom_fmgr_hook again Yours, Laurenz Albe
Hello, > Try like this: > - connect with psql > - call your custom_fmgr_hook > - attach to the backend with gdb > - set the breakpoint > - call custom_fmgr_hook again I tried to check in a different way, by just using log statements to see if customs* hook functions ever get executed. They were not. So it was not a breakpoint or debugger issue. Then instead of using auto_explain, we created a user defined sysdate function, implemented in C and added the fmgr hook code in there. Now we see custom hook functions being called. So looks like it was not a debugger issue, but fmgr hook work within user defined functions Thank you, Sameer