原来比较熟悉用gdb调试C程序,没有用过gdb调试C++程序,原理上没有什么区别。在形式上有一些区别,因为C++支持名字空间和class等机制,把函数的可见域做了隔离。
拿envoy的代码作个例子:
代码片段如下:
1 namespace Envoy { 2 namespace Upstream { 3 4 RingHashLoadBalancerStats RingHashLoadBalancer::generateStats(Stats::Scope& scope) { 5 return {ALL_RING_HASH_LOAD_BALANCER_STATS(POOL_GAUGE(scope))}; 6 } 7 8 HostConstSharedPtr RingHashLoadBalancer::Ring::chooseHost(uint64_t h) const { 9 if (ring_.empty()) { 10 return nullptr; 11 } 12 ...... 13 }
}
}
一、设置断点
比如:对于chooseHost函数,设置断点,需要加上namespace::class作为前缀
(gdb) b Envoy::Upstream::RingHashLoadBalancer::Ring::chooseHost
Breakpoint 1 at 0xcd0f42: file source/common/upstream/ring_hash_lb.cc, line 44.(行号仅做参考)