Windows 以及 Xcode下编译调试 libcurl 源码
curl 这个工具大家都很熟悉. 前几天因为要跟踪curl的实现细节, 不得不设法搭建curl的调试工程. 我们分别在windows visual studio 和 mac 上的 xcode 下搭建调试. 这里记录一些细节,分享出来.
curl 可以在数十个平台上编译运行.
这是官网地址: http://curl.haxx.se
请在这里下载源码: http://curl.haxx.se/download.html
下载解压.
一. Windows 调试:
在 windows 上调试比较简单. 自带工程文件.
直接用 VS2012 打开 \projects\Windows\VC11 里面的 工程文件就可以了。
务必用vs2012 打开。
直接 F10 就可以单步 到 main 函数。
二. Mac Xcode 调试.
我们主要说说 xcode 调试.
大概是因为 *nix 上的编译比较方便, 所以都是使用 makefile 编译. 所以没有自带工程文件.
所幸的是, 开源项目 cmake 可以根据 makefile 和配置文件逆向生成工程文件. 而更好的消息是 curl 早期是支持 cmake 的. 所以我们需要修改一下 curl 的配置文件, 并结合 cmake 来逆向生成 它在 xcode 上的工程文件.
开工.
1) 需要先安装cmake
下载 cmake 源码, http://www.cmake.org/files/v3.1/cmake-3.1.0-rc1.tar.gz
然后解压, 进去: ./configure && make && make install
一切顺利的话,应该就能成功了。
2) 生成 makefile
第二步, 我们需要生成curl 的 makefile. 进入curl的源码目录:
./configure --without-libssh2 --with-darwinssl
make
说明一下, 我们这里指定了两个参数, 我们不需要 curl 支持 ssh, 所以把”–without-libssh2 ” 排除. 而且”–with-darwinssl” 指定使用 mac 上的 ssl 实现, 而不需要 openssl.
这样可以减少出错的可能性, 而且, 我们就需要 darwinssl.
3) 生成 xcode 工程.
前面几步都没什么特别的, 这一步是关键, 使用 cnamke 逆向生成工程.
在 curl 的源码根目录中, 有一个文件 “CMakeLists.txt” 这个是逆向生成所必须的配置文件. 这是curl 官方提供的, 但是已经很旧了, 年久失修, 不能工作了.
我们可以先尝试一下:
mkdir -p build/xcode
cd build/xcode
cmake ../../$CURL -G Xcode
说明一下, 创建一个子目录保存工程. 然后使用命令:
cmake ../../$CURL -G Xcode
来生成工程.
这一步会报大量的错误在”CMakeLists.txt” 中.
请使用附件中这个我修改过的版本代替源码中的版本, 然后再重复执行上面的命令生成.
CMakeLists.txt
工程文件已经生成了.

但是此时打开工程编译不过. 需要先对工程文件做一些修改:
具体请查看下面的命令.
sed -i "" "s/OTHER_LDFLAGS = \"/OTHER_LDFLAGS = \"-framework Cocoa -framework CoreFoundation -framework CoreServices -framework Security -fobjc-link-runtime -framework LDAP/" CURL.xcodeproj/project.pbxproj
在工程中添加了一些 link target. 比较简单. 不多说了.
现在设置一下 调试工程, 就可以调试了.

然后选中 curl 这个target:

然后找到 main 函数. 就可以单步调试了:
欢迎访问我的个人独立博客: http://byNeil.com
Windows 以及 Xcode下编译调试 libcurl 源码的更多相关文章
- Windows+VS2012环境下编译调试MySQL源码 转
http://m.blog.csdn.net/blog/SnowyWolf/18952643
- MAC 下编译 ANDROID P 源码 提示 internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13"]
MAC 下编译 ANDROID P 源码出现下面的问题: ninja: no work to do. [21/21] out/soong/.bootstrap/bin/soong_build out/ ...
- 编译调试Net6源码
前言 编辑调试DotNet源码可按照官网教程操作,但因为网络问题中间会出现各种下载失败的问题,这里出个简单的教程(以6为版本) 下载源码 下载源码 GitHub下载源码速度极慢,可替换为国内仓库htt ...
- Windows下编译Python2.7源码
本文开始一个系列文章,深入理解Python源码,算是阅读<Python源码剖析>一书的读书笔记,是一项长期进行的工作.一共分三个部分:Python对象模型,Python虚拟机,Python ...
- 在eclipse下编译hadoop2.0源码
Hadoop是一个分布式系统基础架构,由apache基金会维护并更新.官网地址: http://hadoop.apache.org/ Hadoop项目主要包括以下4个模块: Hadoop Common ...
- 【转】如何在Ubuntu11.10(32位)下编译Android4.0源码(图文)
原文网址:http://blog.csdn.net/flydream0/article/details/7046612 关于如何下载Android4.0的源码请参考我的另一篇文章: http://bl ...
- elementary os 0.4.1下编译GCC-7.1源码并安装成功
参考文章:http://www.2cto.com/os/201402/281131.html 前几天为了图个新鲜,安装了elementary os 0.4.1,的确是一股清流,可惜的是gcc版本觉得有 ...
- Ubuntu16.04下编译android6.0源码
http://blog.csdn.net/cnliwy/article/details/52189349 作为一名合格的android开发人员,怎么能不会编译android源码呢!一定要来一次说编译就 ...
- windows下编译调试nginx
typora-copy-images-to: image windows下编译调试nginx linux使用gdb跟踪代码效率不高,在通过跟踪代码进行源码分析,与定位复杂逻辑问题时,如果有一个简单易用 ...
随机推荐
- java web 程序---购物车项目内容:
1.项目介绍 典型电子商务系统(在线购物平台).模拟了当当系统部分功能.2.功能需求 1)用户管理模块(3天)user 实现登录.注册功能 2)产品浏览模块(2天)ma ...
- 【UVALive】2965 Jurassic Remains(中途相遇法)
题目 传送门:QWQ 分析 太喵了~~~~~ 还有中途相遇法这种东西的. 嗯 以后可以优化一些暴力 详情左转蓝书P58 (但可能我OI生涯中都遇不到正解是这个的题把...... 代码 #include ...
- Ubuntu 升级内核版本
查看当前内核版本 sch01ar@ubuntu:~$ uname -r Ubuntu 内核地址:https://kernel.ubuntu.com/~kernel-ppa/mainline/ 打开这个 ...
- Python2操作中文名文件乱码解决方案
Python2默认是不支持中文的,一般我们在程序的开头加上#-*-coding:utf-8-*-来解决这个问题,但是在我用open()方法打开文件时,中文名字却显示成了乱码. 我先给大家说说Pytho ...
- 配置mysql环境变量
配置mysql环境变量(非必要) 说明:给mysql配置环境变量后我们就可以在cmd里运行mysql(开启.停止等操作) 1. 和其实环境变量的配置方法一样,我们打开环境变量配置窗口(组合键win+P ...
- 765. Couples Holding Hands
▶ n 对夫妻共 2n 个人随机坐成一排,“交换其中某两人的位置” 称为一次操作,求最少的操作此次数,使 n 对夫妻两人都相邻.初始座位为非负整数列 D1n-1,其中值为 2k 和 2k+1 的两个元 ...
- Nginx Linux yum安装
-- 安装>yum install nginx -y -- 查看>whereis nginx >目录>/usr/sbin/nginx 执行命令>/etc/nginx 配置 ...
- Zabbix 监控 Cisco ASA5525 流量
简介: Zabbix 监控 Cisco ASA5525 网络接口流量 一.Zabbix 支持 SNMP.Cisco 开启 SNMP 二.测试 shell > snmpwalk -v 2c -c ...
- 归纳整理Linux下C语言常用的库函数----内存及字符串控制及操作
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
- mysql 搜索字段不包含数字
select a.REG_CN_NAME,a.REG_NUM,a.INT_CLS from T_FENFA_43_TM_HOLDERINFO a where a.REG_CN_NAME NOT RE ...