如何使用gdb调试Varnish VMOD?断点无法触发问题排查
调试Varnish VMOD的GDB断点问题
为什么b vmod_modifyparams无法命中?
直接用VMOD名称作为断点是错误的——Varnish VMOD的导出函数都会带上vmod_<VMOD名>_<函数名>的前缀,vmod_modifyparams本身不是可执行的函数名,因此GDB找不到它。
正确的调试步骤
1. 确认VMOD的导出函数名
用nm工具列出VMOD共享库的导出符号,定位你要调试的函数:
nm -D /usr/lib/varnish/vmods/libvmod_modifyparams.so | grep vmod_
输出示例:
0000000000001234 T vmod_modifyparams_init 0000000000001456 T vmod_modifyparams_set_param
带T标记的即为可设置断点的函数。
2. 附加到正确的Varnish进程
Varnish分为主管理进程(mgt)和缓存子进程(cache),仅cache子进程会执行VMOD的业务逻辑。用ps找到cache进程的PID:
ps aux | grep varnish
找到输出中带[cache]标记的进程,比如:
varnish 1234 0.0 0.5 123456 7890 ? Sl 10:00 0:00 varnishd [cache]
再用GDB附加到该PID:
gdb -p 1234
3. 设置正确的断点
根据第一步查到的函数名设置断点,例如调试set_param函数:
b vmod_modifyparams_set_param
如果GDB提示函数未定义,说明VMOD尚未加载——此时可先发送一个触发该VMOD逻辑的请求(命中使用该VMOD的VCL),再执行断点命令;或用info sharedlibrary确认libvmod_modifyparams.so是否已加载。
4. 验证断点触发
设置断点后,再次发送请求触发VMOD逻辑,GDB会自动暂停在断点位置。若仍未触发,检查:
- 是否附加到了cache子进程(你的GDB栈显示当前处于主进程的
MCH_Start_Child逻辑,说明附加错了进程) - 函数名是否完全匹配(注意大小写和前缀)
- VMOD是否真的用
-g -O0编译(用file /path/to/libvmod_modifyparams.so查看,输出需包含with debug_info)
针对你提供的GDB输出的说明
你的调用栈显示当前处于Varnish主进程的子进程启动逻辑中,意味着你附加的是主管理进程,而非处理请求的cache子进程。主进程仅负责启动和管理cache子进程,不会执行VMOD的业务代码,因此断点永远无法触发。
内容的提问来源于stack exchange,提问作者duffn
相关产品推荐
相关产品推荐

