• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xiaotianhu
V2EX  ›  程序员

从 PHP 到 C++太痛苦了

  •  2
     
  •   xiaotianhu · Aug 24, 2021 · 9735 views
    This topic created in 1901 days ago, the information mentioned may be changed or developed.

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

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

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

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

    GDB 还没空学怎么用。

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

    72 replies  •  2021-08-26 23:56:48 +08:00
    aneostart173
    aneostart173
    Aug 24, 2021
    1
    看你的描述像是搞逆向搞外挂。
    xiaotianhu
    xiaotianhu
    OP
    Aug 24, 2021
    2
    @aneostart173 正经大厂的正经项目好伐
    Rwing
    Rwing
    Aug 24, 2021
    3
    欢迎了解一下 C#
    Adriel
    Adriel
    Aug 24, 2021
    4
    现在这阶段是挺痛苦的,适应一个项目后,你会越用越爽。
    我现在碰都不想碰 PHP
    CodeCodeStudy
    CodeCodeStudy
    Aug 24, 2021
    5
    别 var_dump 了,用断点调试,从 PHP 转 Java 或 C# 的话就容易很多,搞 C++ 的话就相差太多了,建议跑路
    debuggerx
    debuggerx
    Aug 24, 2021
    6
    工具问题
    上 CLion
    sadfQED2
    sadfQED2
    Aug 24, 2021 via Android
    7
    支持 5 楼,都 c++了,就别 var_dump 了,另外,就算是 php,也建议看看 xdebug
    alexkkaa
    alexkkaa
    Aug 24, 2021 via Android❤️2
    8
    Php 易招黑 处于鄙视链底层。

    动态语言就是机动灵活,这点静态语言就不要比了。
    ysc3839
    ysc3839
    Aug 24, 2021
    9
    > 数据结构只能硬猜
    配合 IDE 的调试功能能部分解决该问题。
    nicevar
    nicevar
    Aug 24, 2021❤️2
    10
    主要还是定势思维,老想用 php 的做法套在 c++上,你的痛苦断点就能解决,弄个好点的 IDE,比如宇宙第一 VS,爽得不要不要的
    786375312123
    786375312123
    Aug 24, 2021
    11
    VS 可以看数据类型啊,记得把优化关了
    jmc891205
    jmc891205
    Aug 24, 2021
    12
    还是学一下 gdb 吧
    shayuvpn0001
    shayuvpn0001
    Aug 24, 2021
    13
    宇宙第一 IDE visual studio,各种跳转 Go To Definition,如果是内核的话,还有一个 Source Insight 。
    lyhiving
    lyhiving
    Aug 24, 2021 via Android
    14
    我刚用一个月搞定某 ERP,一样都是靠猜,确保到数据库一致。简直抓狂
    neutrino
    neutrino
    Aug 24, 2021 via Android
    15
    用 printf 解决 var dump 问题即可
    nevin47
    nevin47
    Aug 24, 2021
    16
    刚想说把 GDB 学会比 var_dump 不知道好用多少,就看到 LZ 说的:GDB 还没空学怎么用。

    好好把 GDB 学会吧,用不了多久的。
    另外从 LZ 描述看,应该 Xdebug 也用得少,推荐一并学学
    stallman
    stallman
    Aug 24, 2021
    17
    感同身受。从 py 转到 C++ + 不了解的业务。偶尔被一个问题困惑的要抓狂,耐心 耐心还是他娘的耐心
    BeautifulSoap
    BeautifulSoap
    Aug 24, 2021❤️4
    18
    我寻思就算是 PHP 你调试程序也有 xdebug 可以下断点啊,而且有时候时候用 xdebug 看数据结构啊控制流程啊也比你 var_dump 方便很多啊

    这不是语言的问题,单纯是调试方法论的问题
    joshua7v
    joshua7v
    Aug 24, 2021
    19
    调试工具一定要熟
    毕竟大部分时间都是在调试
    就调试工具来说 windows 上的工具优秀很多
    ReferenceE
    ReferenceE
    Aug 24, 2021 via Android
    20
    转 Java 吧,C#
    @Rwing 🐶都不用
    gBurnX
    gBurnX
    Aug 24, 2021❤️2
    21
    PHP 的优点是开发效率极高,缺点是运行效率极低、动态类型容易出错。

    C++的优缺点正好相反。

    问题是,你现在的情况,刚好踩了 C++的缺点,却又没感受到 C++的优点,所以你才会有这种抱怨。

    1.C++调试是否麻烦,要看 IDE 。
    C++开发与调试的正确姿势是:宇宙最强 IDE:VS,8 个显示器铺开。VS 有 4 个 debug 面板,每个显示一个。2 个显示器写代码,1 个显示器查资料,一个显示器跑 IM 。

    所以,你要观察什么变量,直接把变量丢 debug 面板里。

    至于改一行代码编译要几分钟,一大堆依赖,这是为了运行性能而设计的过程。

    你初学,一上手就用非常麻烦的 GDB,所以才麻烦。

    PHPer 调试依赖 var_dump,其实是个不好的习惯。应该要多用 IDE 的 debug 面板。
    BrettD
    BrettD
    Aug 24, 2021❤️1
    22
    我觉得你的问题是你在用 PHP 的习惯搞 C++
    cabing
    cabing
    Aug 24, 2021
    23
    日志和 debug 结合一起哦
    ioschina1
    ioschina1
    Aug 24, 2021
    24
    从 php 到 c++的话,会感觉失去了自由
    LxExExl
    LxExExl
    Aug 25, 2021
    25
    我也是从 php 到 c++干了一段时间,实在受不了 c++的一堆桎梏,直接删库跑路,换组了。这辈子再也不碰 c++了。
    gesse
    gesse
    Aug 25, 2021
    26
    Phper 的职业能力能写 c++?🐶🐶🐶
    yEhwG10ZJa83067x
    yEhwG10ZJa83067x
    Aug 25, 2021❤️1
    27
    @gBurnX 8 个显示器铺开,不知情的还以为你炒股的呢
    raysonlu
    raysonlu
    Aug 25, 2021
    28
    或者外包出去干?
    seakingii
    seakingii
    Aug 25, 2021
    29
    @gBurnX 8 个显示器?这门槛有点高啊....你平时是用几个显示器的....?
    fiypig
    fiypig
    Aug 25, 2021
    30
    哈哈哈 用 PHP 也不打断点的吗
    mirage13
    mirage13
    Aug 25, 2021
    31
    下断点调试啊,先把语法看明白了再搞
    encro
    encro
    Aug 25, 2021
    32
    我从 PHP 写到 C++的最大痛点是:

    1,包管理不好用;
    2,一大堆人居然都对 std 不熟悉;
    3,多字节转换判断;
    4,结构体和指针随意乱用;
    5,变量类型需要强大的记忆;
    6, 编译等待的时间长;
    7,语法特性太多;
    freemon
    freemon
    Aug 25, 2021
    33
    问题最大的还是内存管理吧,越界读写之后不依赖 valgrind 这些第三方工具都不知道哪里写错了
    QlanQ
    QlanQ
    Aug 25, 2021❤️4
    34
    感觉 PHP 转啥 都难受,PHP 的函数太方便了,其他 的 语言很多 都只能循环。。。。。
    gBurnX
    gBurnX
    Aug 25, 2021
    35
    @justrand

    建议你试试,试一次,你就回不去了。效率提高不知多少。
    sxfscool
    sxfscool
    Aug 25, 2021
    36
    var_dump 这种基于 print 开发也只能动态语言用用了,需要编译的用这个,时间全都在编译上了
    gBurnX
    gBurnX
    Aug 25, 2021
    37
    @seakingii

    门槛不高。

    首先,编程用的入门显示器,600-700 元一个,甚至二手的有点瑕疵的大概 400 元。

    上下双层显示器支架不到百元。

    4 显示输出的显卡 GTX 750 以上也在 5 百元左右。

    USB 显卡大概 1 百元一个,但只能拿来写代码,不能看视频与打游戏。
    sxfscool
    sxfscool
    Aug 25, 2021
    38
    xdebug 安装也稍显麻烦,导致很多 php 开发不会端点 debug
    LPeJuN6lLsS9
    LPeJuN6lLsS9
    Aug 25, 2021
    39
    ide 里断点调试断下之后都有查看结构体内容的功能,我写 python 都经常用这个功能,比 print 好用
    yEhwG10ZJa83067x
    yEhwG10ZJa83067x
    Aug 25, 2021
    40
    @gBurnX
    缺的是没有那么大的空间放八个显示器啊!
    qq1340691923
    qq1340691923
    Aug 25, 2021
    41
    建议您重新回去写 php 呢
    nicebird
    nicebird
    Aug 25, 2021
    42
    没什么技巧,要不然就断点,要不然就打日志。
    ipwx
    ipwx
    Aug 25, 2021
    43
    @encro

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

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

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

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

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

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

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

    1,断点 DEBUG;
    2, 当然是 log,另外的帖子 https://www.v2ex.com/t/797711#reply12 分享的 spdlog 应该就不错
    SmartKeyerror
    SmartKeyerror
    Aug 25, 2021
    59
    @xiaotianhu Google 里面搜 “CLion 远程调试”,有一堆教程,CLion 本身其实还是依赖于 gdb remote debug 的
    zoharSoul
    zoharSoul
    Aug 25, 2021
    60
    @QlanQ #34 只能循环是啥意思啊?
    charlie21
    charlie21
    Aug 25, 2021
    61
    xiaotianhu
    xiaotianhu
    OP
    Aug 25, 2021
    62
    @SmartKeyerror 得空看看,感谢感谢
    xiaotianhu
    xiaotianhu
    OP
    Aug 25, 2021
    63
    @encro 确实,想用好很难 想用起来干活好像也没多难

    我接手这个项目,智能指针什么的都没有,异常什么的用的也少,也没见到 malloc 什么的,就靠 栈内存+全局变量 也能搞。就是感觉很 Ugly
    GeruzoniAnsasu
    GeruzoniAnsasu
    Aug 25, 2021
    64
    @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 出来。没有指针的世界就是优美的世界(
    StrayChild
    StrayChild
    Aug 25, 2021
    65
    人都是有惯性思维的,但人又很容易适应新的环境,接受新的事物,楼主需要的不是技术上的提升,而是内心的安定。
    cz5424
    cz5424
    Aug 26, 2021
    66
    楼主误解他们说的 vs,并不是 vscode,是 visual studio,安下去直接去掉几个 g
    Hardrain
    Hardrain
    Aug 26, 2021
    67
    php 用 var_dump()就像 C 用 printf()调试一样

    学会 gdb 你会发现新世界.
    php 的 xdebug 或 phpdbg 同理.
    dayeye2006199
    dayeye2006199
    Aug 26, 2021
    68
    > 一个 RPC 请求回来的数据是啥得分析半年
    这个应该不是 c++的问题,服务提供方得提供接口说明(例如 protobuf 文件)

    > 改一行代码编译要几分钟,一大堆依赖
    你可能需要 TDD,用测试搞定一些局部功能先

    > GDB 还没空学怎么用
    这个应该先学一下,否则真是两眼一抹黑,靠 print debug 太痛苦
    X2031
    X2031
    Aug 26, 2021
    69
    @ReferenceE C# 可太难了
    SupperMary
    SupperMary
    Aug 26, 2021
    70
    @encro 包管理可以试一下 vcpkg,停好使的
    encro
    encro
    Aug 26, 2021
    71
    @SupperMary

    conan/vcpkg 相对于 pip/composer/go/rust/ruby 差太多,和 nuget/maven 比起来都有点差距。是万 /千 /百的差距。
    ReferenceE
    ReferenceE
    Aug 26, 2021 via Android
    72
    @X2031 在国内的真没必要学,我钻研了 1 年多,到一工作还是用不上
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   674 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 176ms · UTC 20:24 · PVG 04:24 · LAX 12:24 · JFK 15:24
    ♥ Do have faith in what you're doing.