问题描述
我正在开发自己的 IMAP 应用程序,以使用 IMAP 读取和处理来自电子邮件服务器的特定电子邮件消息。我的开发环境是 Ubuntu 20 LTS,使用 eclipse-CDT。
我决定使用 libcurl 作为电子邮件服务器的接口,因为我在另一个项目中成功使用了它。我的问题是,当我进行 IMAP 提取(例如 FETCH 4 (BODY.PEEK[1])
)时,我无法看到所有响应。我可以看到 libcurl 与服务器正确对应,并且(通过启用 CURLOPT_VERBOSE
选项),我确实可以看到 libcurl 正在接收来自电子邮件服务器的“丢失”消息文本。我显然需要说服 libcurl 给我“缺失”的细节。
问题是:如何?使用已安装的 libcurl 版本,我无法从我的程序调试到 libcurl,因为已安装的 libcurl 版本没有调试符号。我的解决方案如下。
解决方法
curl 的源代码可从 https://curl.se/ 获得。我的第一次尝试是安装最新版本的 Curl 并使用 sudo make install
在系统中已安装的库上安装 curl 库。这并不成功,我不得不使用备份从几天前创建的保存点恢复我的 Ubuntu 系统。幸运的是,我对备份有点偏执!然后,我下载了与我的 Ubuntu 系统中已安装的 curl 版本相对应的 curl 源代码,并使用 ./configure --enable-debug
选项将它们编译到本地目录中,以生成带有调试符号的 libcurl 调试版本。下一个问题是说服 eclipse 加载我本地版本的 libcurl 而不是系统版本。
解决方案分为两个阶段:
然后可以使用 linux 命令 ldd
来检查程序是否正在加载正确版本的 libcurl.so。但请记住,更改图示路径以适合您的开发环境。
然后我可以调试 curl 代码。经过一些调试后,我找到了问题的解决方案 - 使用 curl 选项 CURLOPT_HEADERFUNCTION
设置的回调函数报告了“丢失”的 IMAP 详细信息。实现这个回调函数给了我“丢失”的消息数据。