从 PHP 到 C++太痛苦了

2021-08-24 16:35:38 +08:00
 xiaotianhu

小白一个,接手两个『挺大』的 C++项目

看懂到是能看懂,但是调试也太麻烦了啊。

没有 var_dump,数据结构只能硬猜,一个 RPC 请求回来的数据是啥得分析半年,本来 var_dump 就解决的事儿可能得看一上午

改一行代码编译要几分钟,一大堆依赖

GDB 还没空学怎么用。

一定是有什么大家都知道我不知道的调试开发技巧吧,球球各位指点如何提升效率

8615 次点击
所在节点    程序员
72 条回复
qq1340691923
2021-08-25 09:56:42 +08:00
建议您重新回去写 php 呢
nicebird
2021-08-25 10:04:10 +08:00
没什么技巧,要不然就断点,要不然就打日志。
ipwx
2021-08-25 10:07:30 +08:00
@encro

3 => 不知道你在说什么
4 => 结构体和类不是一回事么。指针。。。这个没办法,尽量用 unique_ptr / shared_ptr 吧。不要嫌引用计数慢,只要你降低传递 shared_ptr 的频率就行。
5 => IDE please
6 => 这个没办法
7 => 那是你太弱了
ligiggy
2021-08-25 10:26:46 +08:00
有一说一,c++很好玩
myd
2021-08-25 10:33:10 +08:00
深有同感。

我用过 php 调试,也用过 C / C++调试。php 调试的时候变量的类型、值都是非常清楚的。但是调试 C / C++的时候,更多的是看到一个个的指针、内存地址,对代码不是很熟悉的情况下,很难知道它的类型,然后打印出来。如果是复杂的数据结构(数组、字典、链表等),简直是地狱。

另一方面,为啥 C 语言总喜欢用缩写起变量名? ptr 、thd....
xiaotianhu
2021-08-25 10:59:48 +08:00
@encro 5&6 深有同感啊。
我都是在小本子上把变量类型 struct 写下来,对着看的时候方便很多,得能背下来才方便。
编译速度也是,尽管有缓存,编译一次也是分钟级别的,蛋疼。
Xdebug 会用啊, 用的不多,可能还是 PHP 太简单了吧,不需要这些玩意儿。看来得深入一下 GDB 才行了。
xiaotianhu
2021-08-25 11:01:48 +08:00
@myd C 语言总喜欢用缩写起变量名? ptr 、thd....
这不就是 UNIX 的传统么。

如果写一大串,com.xx.window.open.location.xx. 那不就是 java 了吗 hhh
xiaotianhu
2021-08-25 11:10:11 +08:00
还有一点问题
公司用自研的包管理,一大堆依赖,用 VSCode 的 C/C++补全就很难用
在 Mac 上不能编译,Clang 的支持也不行,补全需要的 compiler commands.json 也生成不来
开发机 Centos6 想装个 Nvim 都好难 折腾死了。。。啊 生活 时间都浪费在这些破事儿上了

用 C++写各种基于 string 的判断业务太蛋疼了,各种规则有几千行
我打算集成个 liblua.so 进去用 Lua 来搞规则,性能能有多大影响?就这项目一启动就要 8 个 G 内存而言,我觉得不差这点性能损耗。。。
newmlp
2021-08-25 11:23:09 +08:00
@myd 为什么我感觉我们调试的是两种语言,C++调试可以看到变量类型和值的,即便是字典列表这些也可以啊
xiaotianhu
2021-08-25 11:28:37 +08:00
@newmlp 求介绍技巧,发帖就是因为不熟悉 想讨教一下技巧

所以也是用 GDB 来看? VSCode+GDB 什么的
gdfsjunjun
2021-08-25 11:32:02 +08:00
从 C++到 PHP 太轻松了。毕竟大学只教 C++,C++确实难
newmlp
2021-08-25 11:36:46 +08:00
@xiaotianhu Windows 就用宇宙第一 ide:vs,Linux 下可以用 clion 或者 qtcreator,都是图形化的调试界面,打个断点变量值看的一清二楚
SmartKeyerror
2021-08-25 11:39:38 +08:00
![]( https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/v2ex/Xnip2021-08-25_11-36-47.jpg)

这是我使用 CLion debug leveldb 时的一个截图,CLion 已经非常友好了,对于指针类型来说,也会尽可能地把内容全部输出出来。gdb 的话用于调试多线程程序会比较方便,单线程调试还是 CLion 更舒服,毕竟图形化界面能够承载更多的信息。
nash
2021-08-25 11:44:30 +08:00
从外卖员到米其林大厨太痛苦了
charlie21
2021-08-25 11:55:43 +08:00
是面对全新的问题,其实和语言无关,和过去的一切都无关。迁移能力被严重高估的情况下依然会有人告诉你 “所有编程语言都是图灵等价的” 呸呸呸
xiaotianhu
2021-08-25 12:33:00 +08:00
@SmartKeyerror 学习了,这玩意能远程调试吗,就是服务只能启动在远程 Centos 的,本地是 Mac 的情况下。
encro
2021-08-25 12:46:24 +08:00
@ipwx

3
就是中英文,utf8,gbk 跨平台处理麻烦。
当然这个不是 C++的锅,但是其他语言较好解决了这个问题。比如直接支持 unicode 编码,不用关心究竟是 wstring 还是 string 。

5
7
需要经验较多
对于 windows 来说,DWORD,WORD, TCHAR, WCHAR, CHAR 等等各种类型让新学者望而却步。
struct,typedef,template 出来的各种类型,每次用的时候都需要思考和验证下你当前操作究竟是什么,即使借助 vs,clion 等 IDE,还需要点点点多次才知道吧。
所以对于 C++来说,感觉没有两年经验,很难学好用好。
而其他很多语言,有基础 2 周就可以写出不错程序了。
当然,学好 C++,学其他语言都是 So easy 。所以这也是我学 C++理由吧。
encro
2021-08-25 12:51:12 +08:00
对于题主问题:

1,断点 DEBUG;
2, 当然是 log,另外的帖子 https://www.v2ex.com/t/797711#reply12 分享的 spdlog 应该就不错
SmartKeyerror
2021-08-25 13:40:56 +08:00
@xiaotianhu Google 里面搜 “CLion 远程调试”,有一堆教程,CLion 本身其实还是依赖于 gdb remote debug 的
zoharSoul
2021-08-25 13:53:27 +08:00
@QlanQ #34 只能循环是啥意思啊?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/797738

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX