Я хотел бы отлаживать определяемую пользователем функцию (называемую prepareTheOutputRecord
, реализованную на C/C++, которая является частью определяемой пользователем функции в postgres. Вот как я достигаю этого с помощью gdb:
- Функция
prepareTheOutputRecord
находится в файлеlibMyExtenstion.so
в каталоге lib сервера postgresql. Я запускаю оболочку psql, получаю pid процесса
postgres=# SELECT pg_backend_pid(); pg_backend_pid - - - - - - - - - - - - - - 4120 (1 row)
Запустите gdb с прикрепленным pid:
gdb -p 4120
Найдите теперь файл .so, как именно называется функция:
nm -as libMyExtenstion.so | grep prepareTheOputRecord 00000000002633fe t _ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData
Установите точку останова в gdb и запустите программу:
(gdb) b _ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData Function "_ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData" not defined. Make breakpoint pending on future shared library load? (y or [n]) y Breakpoint 1 (_ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData) pending. (gdb) c
Выполните SQL в psql. В какой-то момент в gdb срабатывает точка останова:
Breakpoint 1, prepareTheOutputRecord (this=0x1116410, fcinfo=0x7fff3a41e150) at ../Dir/file.cpp:1736 1736 funcctx = SRF_PERCALL_SETUP(); (gdb)
Продолжайте отлаживать код.
Я хочу сделать то же самое в kdbg. Для этого я загрузил исполняемый файл postgres, присоединил его к процессу, загрузил файл cpp, установил точку останова с помощью мыши на функции, продолжил выполнение процесса postgres, но точка останова так и не сработала :( Я повторил то же самое с файлом . so (вместо исполняемого файла postgres) без каких-либо успехов.Я даже пытался установить точку останова на _ZN6libafd6LIBAFD22prepareTheOutputRecordEP20FunctionCallInfoData
(без щелчков мыши), но программа не останавливается в kdbg :(