小白一个,接手两个『挺大』的 C++项目
看懂到是能看懂,但是调试也太麻烦了啊。
没有 var_dump,数据结构只能硬猜,一个 RPC 请求回来的数据是啥得分析半年,本来 var_dump 就解决的事儿可能得看一上午
改一行代码编译要几分钟,一大堆依赖
GDB 还没空学怎么用。
一定是有什么大家都知道我不知道的调试开发技巧吧,球球各位指点如何提升效率
1
aneostart173 2021-08-24 16:40:18 +08:00
看你的描述像是搞逆向搞外挂。
|
2
xiaotianhu OP @aneostart173 正经大厂的正经项目好伐
|
3
Rwing 2021-08-24 16:51:55 +08:00
欢迎了解一下 C#
|
4
airplayxcom 2021-08-24 16:59:45 +08:00
现在这阶段是挺痛苦的,适应一个项目后,你会越用越爽。
我现在碰都不想碰 PHP |
5
CodeCodeStudy 2021-08-24 17:01:32 +08:00
别 var_dump 了,用断点调试,从 PHP 转 Java 或 C# 的话就容易很多,搞 C++ 的话就相差太多了,建议跑路
|
6
debuggerx 2021-08-24 17:04:12 +08:00
工具问题
上 CLion |
7
sadfQED2 2021-08-24 17:12:48 +08:00 via Android
支持 5 楼,都 c++了,就别 var_dump 了,另外,就算是 php,也建议看看 xdebug
|
8
alexkkaa 2021-08-24 17:30:40 +08:00 via Android 2
Php 易招黑 处于鄙视链底层。
动态语言就是机动灵活,这点静态语言就不要比了。 |
9
ysc3839 2021-08-24 17:34:53 +08:00
> 数据结构只能硬猜
配合 IDE 的调试功能能部分解决该问题。 |
10
nicevar 2021-08-24 17:36:46 +08:00 2
主要还是定势思维,老想用 php 的做法套在 c++上,你的痛苦断点就能解决,弄个好点的 IDE,比如宇宙第一 VS,爽得不要不要的
|
11
786375312123 2021-08-24 18:08:01 +08:00
VS 可以看数据类型啊,记得把优化关了
|
12
jmc891205 2021-08-24 18:19:33 +08:00
还是学一下 gdb 吧
|
13
shayuvpn0001 2021-08-24 18:57:13 +08:00
宇宙第一 IDE visual studio,各种跳转 Go To Definition,如果是内核的话,还有一个 Source Insight 。
|
14
lyhiving 2021-08-24 19:01:00 +08:00 via Android
我刚用一个月搞定某 ERP,一样都是靠猜,确保到数据库一致。简直抓狂
|
15
neutrino 2021-08-24 19:07:14 +08:00 via Android
用 printf 解决 var dump 问题即可
|
16
nevin47 2021-08-24 19:32:28 +08:00
刚想说把 GDB 学会比 var_dump 不知道好用多少,就看到 LZ 说的:GDB 还没空学怎么用。
好好把 GDB 学会吧,用不了多久的。 另外从 LZ 描述看,应该 Xdebug 也用得少,推荐一并学学 |
17
stallman 2021-08-24 19:38:03 +08:00
感同身受。从 py 转到 C++ + 不了解的业务。偶尔被一个问题困惑的要抓狂,耐心 耐心还是他娘的耐心
|
18
BeautifulSoap 2021-08-24 19:46:56 +08:00 4
我寻思就算是 PHP 你调试程序也有 xdebug 可以下断点啊,而且有时候时候用 xdebug 看数据结构啊控制流程啊也比你 var_dump 方便很多啊
这不是语言的问题,单纯是调试方法论的问题 |
19
joshua7v 2021-08-24 20:17:03 +08:00
调试工具一定要熟
毕竟大部分时间都是在调试 就调试工具来说 windows 上的工具优秀很多 |
20
ReferenceE 2021-08-24 20:41:18 +08:00 via Android
转 Java 吧,C#
@Rwing 🐶都不用 |
21
gBurnX 2021-08-24 21:05:24 +08:00 2
PHP 的优点是开发效率极高,缺点是运行效率极低、动态类型容易出错。
C++的优缺点正好相反。 问题是,你现在的情况,刚好踩了 C++的缺点,却又没感受到 C++的优点,所以你才会有这种抱怨。 1.C++调试是否麻烦,要看 IDE 。 C++开发与调试的正确姿势是:宇宙最强 IDE:VS,8 个显示器铺开。VS 有 4 个 debug 面板,每个显示一个。2 个显示器写代码,1 个显示器查资料,一个显示器跑 IM 。 所以,你要观察什么变量,直接把变量丢 debug 面板里。 至于改一行代码编译要几分钟,一大堆依赖,这是为了运行性能而设计的过程。 你初学,一上手就用非常麻烦的 GDB,所以才麻烦。 PHPer 调试依赖 var_dump,其实是个不好的习惯。应该要多用 IDE 的 debug 面板。 |
22
BrettD 2021-08-24 21:21:22 +08:00 1
我觉得你的问题是你在用 PHP 的习惯搞 C++
|
23
cabing 2021-08-24 22:19:24 +08:00
日志和 debug 结合一起哦
|
24
ioschina1 2021-08-24 23:06:32 +08:00
从 php 到 c++的话,会感觉失去了自由
|
25
LxExExl 2021-08-25 02:09:36 +08:00
我也是从 php 到 c++干了一段时间,实在受不了 c++的一堆桎梏,直接删库跑路,换组了。这辈子再也不碰 c++了。
|
26
gesse 2021-08-25 06:23:40 +08:00
Phper 的职业能力能写 c++?🐶🐶🐶
|
27
yEhwG10ZJa83067x 2021-08-25 08:25:05 +08:00 1
@gBurnX 8 个显示器铺开,不知情的还以为你炒股的呢
|
28
raysonlu 2021-08-25 08:54:55 +08:00
或者外包出去干?
|
30
fiypig 2021-08-25 08:59:51 +08:00
哈哈哈 用 PHP 也不打断点的吗
|
31
mirage13 2021-08-25 09:02:50 +08:00
下断点调试啊,先把语法看明白了再搞
|
32
encro 2021-08-25 09:09:47 +08:00
我从 PHP 写到 C++的最大痛点是:
1,包管理不好用; 2,一大堆人居然都对 std 不熟悉; 3,多字节转换判断; 4,结构体和指针随意乱用; 5,变量类型需要强大的记忆; 6, 编译等待的时间长; 7,语法特性太多; |
33
freemon 2021-08-25 09:24:34 +08:00
问题最大的还是内存管理吧,越界读写之后不依赖 valgrind 这些第三方工具都不知道哪里写错了
|
34
QlanQ 2021-08-25 09:29:03 +08:00 4
感觉 PHP 转啥 都难受,PHP 的函数太方便了,其他 的 语言很多 都只能循环。。。。。
|
36
sxfscool 2021-08-25 09:34:34 +08:00
var_dump 这种基于 print 开发也只能动态语言用用了,需要编译的用这个,时间全都在编译上了
|
37
gBurnX 2021-08-25 09:35:01 +08:00
@seakingii
门槛不高。 首先,编程用的入门显示器,600-700 元一个,甚至二手的有点瑕疵的大概 400 元。 上下双层显示器支架不到百元。 4 显示输出的显卡 GTX 750 以上也在 5 百元左右。 USB 显卡大概 1 百元一个,但只能拿来写代码,不能看视频与打游戏。 |
38
sxfscool 2021-08-25 09:35:56 +08:00
xdebug 安装也稍显麻烦,导致很多 php 开发不会端点 debug
|
39
LPeJuN6lLsS9 2021-08-25 09:37:52 +08:00
ide 里断点调试断下之后都有查看结构体内容的功能,我写 python 都经常用这个功能,比 print 好用
|
40
yEhwG10ZJa83067x 2021-08-25 09:40:19 +08:00
@gBurnX
缺的是没有那么大的空间放八个显示器啊! |
41
qq1340691923 2021-08-25 09:56:42 +08:00
建议您重新回去写 php 呢
|
42
nicebird 2021-08-25 10:04:10 +08:00
没什么技巧,要不然就断点,要不然就打日志。
|
43
ipwx 2021-08-25 10:07:30 +08:00
@encro
3 => 不知道你在说什么 4 => 结构体和类不是一回事么。指针。。。这个没办法,尽量用 unique_ptr / shared_ptr 吧。不要嫌引用计数慢,只要你降低传递 shared_ptr 的频率就行。 5 => IDE please 6 => 这个没办法 7 => 那是你太弱了 |
44
ligiggy 2021-08-25 10:26:46 +08:00
有一说一,c++很好玩
|
45
myd 2021-08-25 10:33:10 +08:00
深有同感。
我用过 php 调试,也用过 C / C++调试。php 调试的时候变量的类型、值都是非常清楚的。但是调试 C / C++的时候,更多的是看到一个个的指针、内存地址,对代码不是很熟悉的情况下,很难知道它的类型,然后打印出来。如果是复杂的数据结构(数组、字典、链表等),简直是地狱。 另一方面,为啥 C 语言总喜欢用缩写起变量名? ptr 、thd.... |
46
xiaotianhu OP @encro 5&6 深有同感啊。
我都是在小本子上把变量类型 struct 写下来,对着看的时候方便很多,得能背下来才方便。 编译速度也是,尽管有缓存,编译一次也是分钟级别的,蛋疼。 Xdebug 会用啊, 用的不多,可能还是 PHP 太简单了吧,不需要这些玩意儿。看来得深入一下 GDB 才行了。 |
47
xiaotianhu OP @myd C 语言总喜欢用缩写起变量名? ptr 、thd....
这不就是 UNIX 的传统么。 如果写一大串,com.xx.window.open.location.xx. 那不就是 java 了吗 hhh |
48
xiaotianhu OP 还有一点问题
公司用自研的包管理,一大堆依赖,用 VSCode 的 C/C++补全就很难用 在 Mac 上不能编译,Clang 的支持也不行,补全需要的 compiler commands.json 也生成不来 开发机 Centos6 想装个 Nvim 都好难 折腾死了。。。啊 生活 时间都浪费在这些破事儿上了 用 C++写各种基于 string 的判断业务太蛋疼了,各种规则有几千行 我打算集成个 liblua.so 进去用 Lua 来搞规则,性能能有多大影响?就这项目一启动就要 8 个 G 内存而言,我觉得不差这点性能损耗。。。 |
50
xiaotianhu OP |
51
gdfsjunjun 2021-08-25 11:32:02 +08:00
从 C++到 PHP 太轻松了。毕竟大学只教 C++,C++确实难
|
52
newmlp 2021-08-25 11:36:46 +08:00
@xiaotianhu Windows 就用宇宙第一 ide:vs,Linux 下可以用 clion 或者 qtcreator,都是图形化的调试界面,打个断点变量值看的一清二楚
|
53
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 更舒服,毕竟图形化界面能够承载更多的信息。 |
54
nash 2021-08-25 11:44:30 +08:00
从外卖员到米其林大厨太痛苦了
|
55
charlie21 2021-08-25 11:55:43 +08:00
是面对全新的问题,其实和语言无关,和过去的一切都无关。迁移能力被严重高估的情况下依然会有人告诉你 “所有编程语言都是图灵等价的” 呸呸呸
|
56
xiaotianhu OP @SmartKeyerror 学习了,这玩意能远程调试吗,就是服务只能启动在远程 Centos 的,本地是 Mac 的情况下。
|
57
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++理由吧。 |
58
encro 2021-08-25 12:51:12 +08:00
|
59
SmartKeyerror 2021-08-25 13:40:56 +08:00
@xiaotianhu Google 里面搜 “CLion 远程调试”,有一堆教程,CLion 本身其实还是依赖于 gdb remote debug 的
|
61
charlie21 2021-08-25 14:09:55 +08:00
|
62
xiaotianhu OP @SmartKeyerror 得空看看,感谢感谢
|
63
xiaotianhu OP |
64
GeruzoniAnsasu 2021-08-25 17:25:06 +08:00
@xiaotianhu 哈哈哈哈哈我一直等了一天才懂为什么有这些莫名其妙的头疼点。
clion,请。写 c++不用 IDE 跟写 java 不用 IDE 一样,与其说自虐不如说「我看你完全不懂哦」 #6 已经一眼看穿了 > 用 C++写各种基于 string 的判断业务太蛋疼了,各种规则有几千行 > 我打算集成个 liblua.so 进去用 Lua 来搞规则,性能能有多大影响 前公司项目为了解决规则太复杂的问题,依次尝试了 1. 把规则拆成好几部分,每个部分重新开了一个项目各自处理业务(服务化) 2. 让上游分担一部分规则复杂度,如把历史版本,冲突判断等逻辑从解析者( native lib, c++)挪到下发者( web 后台,混合语言) 3. 创造一门新 DSL,不再用数据描述逻辑,而使用逻辑去描述数据。为此还搞了套新的虚拟机指令集 所以用 lua 倒也不会让人感到奇怪。只不过 lua 有很多意想不到的坑,比如多线程、jit 、(与 host 语言的)数据类型绑定、guest 语言的内存管理……能不加就别加,不然——反正第三步从 0 到稳定敢宣传用了一年半 另外关于开发环境我们的最佳实践是 1. 编译环境打包成 docker,这样 dockerfile 里其实就完整记录了所需的库和来源方法 2. 本地开发环境尽量 linux,可以照搬 3. cmake 尽量给 darwin 留一套可以 build 的组合,比如关掉平台相关模块,使用空数据结构之类的。目的是能让编译器检查语法错误就行,make 交给 docker 环境 > 我接手这个项目,智能指针什么的都没有,异常什么的用的也少,也没见到 malloc 什么的,就靠 栈内存+全局变量 也能搞。就是感觉很 Ugly 说实话这个状态已经很理想了,全局变量也就污染一下 namespace,崩也崩在最开始很容易找,我看到都已经不会再吐槽了……局部变量?那可太优雅了!我来帮你们写 move ctor 和 RAII,你们可千万别哪自己搞两行 new 出来。没有指针的世界就是优美的世界( |
65
StrayChild 2021-08-25 21:09:05 +08:00
人都是有惯性思维的,但人又很容易适应新的环境,接受新的事物,楼主需要的不是技术上的提升,而是内心的安定。
|
66
cz5424 2021-08-26 00:42:59 +08:00
楼主误解他们说的 vs,并不是 vscode,是 visual studio,安下去直接去掉几个 g
|
67
Hardrain 2021-08-26 01:53:53 +08:00
php 用 var_dump()就像 C 用 printf()调试一样
学会 gdb 你会发现新世界. php 的 xdebug 或 phpdbg 同理. |
68
dayeye2006199 2021-08-26 04:05:07 +08:00
> 一个 RPC 请求回来的数据是啥得分析半年
这个应该不是 c++的问题,服务提供方得提供接口说明(例如 protobuf 文件) > 改一行代码编译要几分钟,一大堆依赖 你可能需要 TDD,用测试搞定一些局部功能先 > GDB 还没空学怎么用 这个应该先学一下,否则真是两眼一抹黑,靠 print debug 太痛苦 |
69
X2031 2021-08-26 09:17:35 +08:00
@ReferenceE C# 可太难了
|
70
SupperMary 2021-08-26 16:27:37 +08:00
@encro 包管理可以试一下 vcpkg,停好使的
|
71
encro 2021-08-26 17:35:23 +08:00
|
72
ReferenceE 2021-08-26 23:56:48 +08:00 via Android
@X2031 在国内的真没必要学,我钻研了 1 年多,到一工作还是用不上
|