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 源码的更多相关文章

  1. Windows+VS2012环境下编译调试MySQL源码 转

    http://m.blog.csdn.net/blog/SnowyWolf/18952643

  2. 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/ ...

  3. 编译调试Net6源码

    前言 编辑调试DotNet源码可按照官网教程操作,但因为网络问题中间会出现各种下载失败的问题,这里出个简单的教程(以6为版本) 下载源码 下载源码 GitHub下载源码速度极慢,可替换为国内仓库htt ...

  4. Windows下编译Python2.7源码

    本文开始一个系列文章,深入理解Python源码,算是阅读<Python源码剖析>一书的读书笔记,是一项长期进行的工作.一共分三个部分:Python对象模型,Python虚拟机,Python ...

  5. 在eclipse下编译hadoop2.0源码

    Hadoop是一个分布式系统基础架构,由apache基金会维护并更新.官网地址: http://hadoop.apache.org/ Hadoop项目主要包括以下4个模块: Hadoop Common ...

  6. 【转】如何在Ubuntu11.10(32位)下编译Android4.0源码(图文)

    原文网址:http://blog.csdn.net/flydream0/article/details/7046612 关于如何下载Android4.0的源码请参考我的另一篇文章: http://bl ...

  7. elementary os 0.4.1下编译GCC-7.1源码并安装成功

    参考文章:http://www.2cto.com/os/201402/281131.html 前几天为了图个新鲜,安装了elementary os 0.4.1,的确是一股清流,可惜的是gcc版本觉得有 ...

  8. Ubuntu16.04下编译android6.0源码

    http://blog.csdn.net/cnliwy/article/details/52189349 作为一名合格的android开发人员,怎么能不会编译android源码呢!一定要来一次说编译就 ...

  9. windows下编译调试nginx

    typora-copy-images-to: image windows下编译调试nginx linux使用gdb跟踪代码效率不高,在通过跟踪代码进行源码分析,与定位复杂逻辑问题时,如果有一个简单易用 ...

随机推荐

  1. python报头解决粘包简单实现

    client------------- #!/usr/bin/env python # encoding: utf-8  # Date: 2018/6/5 import socketimport st ...

  2. Microsoft Office Professional Plus 2013全套

    Microsoft Office Professional Plus 2013全套产品,全激活版本 包括Access  Word  Excel  Powerpoint  Publisher  Skyd ...

  3. maven常用命令集合

    作者:ydlmlh 原文:http://ydlmlh.iteye.com/blog/2158973 抽了点时间,整理了一些maven常用命令参数,以便参考:参考了maven官网和网上其他一些maven ...

  4. fekit 搭建

    sudo apt-get install npmsudo apt-get install nodejs 保证npm配置正确 sudo  npm config set registry http://r ...

  5. window 10 javac不是内部或外部命令

    今天在新电脑上配置Java环境变量(window 10),不管怎么配置都是提示“javac不是内部或外部命令”,java,java -version命令是正常的. 后来发现是path路径配置的不对,修 ...

  6. sdc-docker

    ssh root@109.105.7.96 sdc-login docker /opt/smartdc/docker ls /var/svc/log/ cat smartdc-application- ...

  7. maven下拉项目不能同步

    maven下拉项目不能同步,如下图: 解决方法: 对项目右键,team, 选择这里 我选择第一项,有的需要根据情况选择第二项,如果点击完成后,还是不能同步代码,对项目右键,team,disconnec ...

  8. Golang笔记之变量

    哈哈 package main // 关键字var 声明变量 类型信息放在变量名后 //声明一个int型变量 var v1 int //声明一个string类型 var v2 string //声明多 ...

  9. Laravel 5 项目部署到生产环境的实践

    作者:mrcn链接:https://www.zhihu.com/question/35537084/answer/181734431来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  10. yum 系列(一) yum 和 rpm 常用命令

    yum 系列(一) yum 和 rpm 常用命令 一.yum 常用命令 yum 命令:http://man.linuxde.net/yum yum 是在 Fedora 和 RedHat 以及 SUSE ...