gdb debug peer 程序

在开始我们从 github 上download 下来的源码包,实际上已经包含了可执行的 peer 程序,但是该程序是使用 release 方式编译的,并不支持gdb 直接debug,所以我们需要对源码从新编译peer。

在开始编译前,读者应该了解,由于“神秘的东方力量”,程序试图从golang 库中download 安装包时,需要“科学上网”。

假设 fabric 的源码被download 在 /opt/gopath/src/github.com/hyperledger/fabric,切换到该目录后,对 Makefile 进行修改,加入debug 编译(大约360行),红色部分为修改的内容。

传递参数-ldflags "-s",忽略debug的打印信息;传递-gcflags "-N -l" 参数,这样可以忽略Go内部做的一些优化,聚合变量和函数等优化,这样对于GDB调试来说非常困难,所以在编译的时候加入这两个参数避免这些优化。

release/%/bin/peer: $(PROJECT_FILES)
@echo "Building $@ for $(GOOS)-$(GOARCH)"
mkdir -p $(@D)
$(CGO_FLAGS) GOOS=$(GOOS) GOARCH=$(GOARCH) go build -ldflags "-s" -gcflags "-N -l" -o $(abspath $@) -tags "$(GO_TAGS)" -ldflags "$(GO_LDFLAGS)" $(pkgmap.$(@F))

编译 peer 执行,编译成功后,peer 将在 build/bin/peer

make peer

作者在第一次编译时,还会遇到 protoc-gen-go 命令找不到的问题,错误信息如下

mkdir -p build/image/ccenv/payload
cp build/docker/gotools/bin/protoc-gen-go build/bin/chaintool build/goshim.tar.bz2 build/image/ccenv/payload
cp: cannot stat 'build/docker/gotools/bin/protoc-gen-go': No such file or directory
Makefile:: recipe for target 'build/image/ccenv/payload' failed
make: *** [build/image/ccenv/payload] Error

解决方式是自己安装后拷贝到 build/docker/gotools/bin/ 目录,然后再次执行编译 peer 的命令

cd $GOPATH/src/github.com/golang/
git clone https://git.oschina.net/mellymeng/protobuf.git
go get -u github.com/golang/protobuf/protoc-gen-go
cd $GOPATH
cp bin/protoc-gen-go /opt/gopath/src/github.com/hyperledger/fabric/build/docker/gotools/bin/

编译peer ok 后,按照 hyperledger fabric 1.0.5 分布式部署 (七)介绍的设置环境变量

export CORE_PEER_TLS_ROOTCERT_FILE="/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" ; \
export CORE_PEER_LOCALMSPID="Org1MSP" ; \
export CORE_PEER_TLS_ENABLED=true ; \
export CORE_PEER_TLS_KEY_FILE="/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/server.key" ; \
export CORE_PEER_MSPCONFIGPATH="/opt/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" ; \
export CORE_PEER_ADDRESS="peer0.org1.example.com:7051" ;

使用gdb 启动 peer 程序

gdb build/bin/peer

给 gdb 加入 go 的调试信息,假设 golang 安装在 /opt/go 目录

source /opt/go/src/runtime/runtime-gdb.py

在gdb 中设置peer 的运行参数

set args chaincode query -C mychannel -n mycc --logging-level CRITICAL -c '{"Args":["cert"]}'

在 gdb 中设置断点,例如

b /opt/gopath/src/github.com/hyperledger/fabric/peer/chaincode/common.go:

然后在gdb 执行 run 命令

run

此时gdb 将进入 common.go 程序的99 行,该函数是啥内容呢?peer 处理 chaincodeInvokeOrQuery 的函数。

Breakpoint  at 0xb2cd20: file /opt/gopath/src/github.com/hyperledger/fabric/peer/chaincode/common.go, line .
(gdb) run
Starting program: /opt/gopath/src/github.com/hyperledger/fabric/build/bin/peer chaincode query -C mychannel -n mycc --logging-level CRITICAL -c '{"Args":["cert"]}'
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff73e1700 (LWP )]
[New Thread 0x7ffff6be0700 (LWP )]
[New Thread 0x7ffff63df700 (LWP )]
[New Thread 0x7ffff5a7e700 (LWP )]
[New Thread 0x7ffff527d700 (LWP )]
[Switching to Thread 0x7ffff6be0700 (LWP )] Thread "peer" hit Breakpoint , github.com/hyperledger/fabric/peer/chaincode.chaincodeInvokeOrQuery (cmd=0xc420253200, args= []string, invoke=false, cf=0xc4201833b0,
err=...) at /opt/gopath/src/github.com/hyperledger/fabric/peer/chaincode/common.go:
func chaincodeInvokeOrQuery(cmd *cobra.Command, args []string, invoke bool, cf *ChaincodeCmdFactory) (err error) {

参考博客:

https://stackoverflow.com/questions/41040156/cp-cannot-stat-build-docker-gotools-bin-protoc-gen-go-no-such-file-or-direct

http://blog.csdn.net/iflow/article/details/77951610

http://blog.studygolang.com/2012/12/gdb%E8%B0%83%E8%AF%95go%E7%A8%8B%E5%BA%8F/

hyperledger fabric 1.0.5 分布式部署 (八)的更多相关文章

  1. hyperledger fabric 1.0.5 分布式部署 (七)

    fabric 使用 fabric-ca 服务 准备部分 首先需要用户从github上download fabric-ca 的工程代码 cd $GOPATH/src/github.com/hyperle ...

  2. hyperledger fabric 1.0.5 分布式部署 (六)

    如何在相同的peer 节点上创建多个 channel 作者在hyperledger fabric 1.0.5 分布式部署 (五)已经向读者们介绍了一个简单的fabric 的部署流程,那么根据上一篇博客 ...

  3. hyperledger fabric 1.0.5 分布式部署 (五)

    梳理fabric e2e_cli 测试程序的具体步骤 作者在 hyperledger fabric 1.0.5 分布式部署 (一)中给读者们介绍了如何从零开始部署一个测试的 demo 环境,如果细心的 ...

  4. hyperledger fabric 1.0.5 分布式部署 (四)

    chaincode 的开发 作者在hyperledger fabric 1.0.5 分布式部署 (三)中向读者介绍了如何开发fabric 的chaincode,那么实际上chaincode 还有其他的 ...

  5. hyperledger fabric 1.0.5 分布式部署 (二)

    环境:2台 ubuntu 16.04 角色列表 角色 IP地址 宿主端口 docker端口  peer0.org1.example.com  47.93.249.250  7051  7051  pe ...

  6. hyperledger fabric 1.0.5 分布式部署 (三)

    本篇博客主要是向读者介绍 fabric 在部署时的一些细节,还有作者自己学习过程中的心得. 初始化相关密钥的程序,实际上是一个shell脚本,并且结构特别简单 generateArtifacts.sh ...

  7. hyperledger fabric 1.0.5 分布式部署 (一)

    环境是个人虚拟机ubuntu 16.04 64 位版本 前期用户需要先安装好:gcc.g++.git 软件 安装 golang 首先给环境安装一个 go 语言环境,版本最好在1.8 以上 golang ...

  8. hyperledger fabric 1.0.5 分布式部署 (九)

    linux 使用vim.ctags 配置fabric 源码阅读环境 首先需要安装 ctags,作者使用apt-get 来安装的,安装的版本是5.9 apt-get install ctags 5.9 ...

  9. Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署

    6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...

随机推荐

  1. iOS开发中集成Reveal

    [转]http://blog.devzeng.com/blog/ios-reveal-integrating.html 配置方式一简介有效. Reveal 是一个界面调试工具.使用Reveal,我们可 ...

  2. java.sql.SQLException: Access denied for user 'somebody'@'localhost' (using password: YES)

    用mybatis和spring整合时出现了一个错误: 我是在IntelliJ IDEA上整合Mybatis和Spring的,运行测试用例出现了如上错误. 红色的马赛克部分是我的名字. 问题是,我的数据 ...

  3. 【Java】CookieStore 类使用示例

    CookieStore 是 Java API 中用来处理 HTTP 客户端的 Cookie 存储策略的类.psd素材 1. [代码]WebClient.java      01import java. ...

  4. ThinkPHP基础(1)

    多层MVC模式 M:Model 数据模型层,负责数据操作 V:View 视图层,负责显示视图 C:Controller 控制器,实现业务逻辑 控制器访问及路由解析 通过url地址get参数找到指定的控 ...

  5. 三款功能强大代码比较工具Beyond compare、DiffMerge、WinMerge

    我们经常会遇到需要比较同一文件的不同版本,特别是代码文件.如果人工去对比查看,势必费时实力还会出现纰漏和错误,因此我们需要借助一些代码比较的工具来自动完成这些工作.这里介绍3款比较流行且功能强大的工具 ...

  6. python 列表之队列

    列表实现队列操作(FIFO),可以使用标准库里的 collections.deque,deque是double-ended quene的缩写,双端队列的意思,它可以实现从队列头部快速增加和取出对象. ...

  7. 苹果手机app试玩赚钱平台汇总

    注意: 微信扫码下载,绑定手机号和微信.才能提现 每天3点更新任务,4点最多! | 平台 | 提现额 | 任务量| 推荐强度 | 扫码 | 1.小鱼,10元,大量,强推! →点开扫码 2.天天飞燕,5 ...

  8. python web server gateway interface (wsgi ) notes

    前言: 注:如果需要得到支持批Python3.x以及包含了勘误表,附录,和说明的更新版规范,请查看PEP 3333 摘要: 这篇文档详细说明了一套在web服务器与Python web应用程序(web框 ...

  9. CodeForces - 660F:Bear and Bowling 4(DP+斜率优化)

    Limak is an old brown bear. He often goes bowling with his friends. Today he feels really good and t ...

  10. 【LeetCode】091. Decode Ways

    题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...