从 PHP 到 C++太痛苦了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
xiaotianhu
V2EX    程序员

从 PHP 到 C++太痛苦了

  •  2
     
  •   xiaotianhu 2021-08-24 16:35:38 +08:00 8646 次点击
    这是一个创建于 1508 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    GDB 还没空学怎么用。

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

    72 条回复    2021-08-26 23:56:48 +08:00
    aneostart173
        1
    aneostart173  
       2021-08-24 16:40:18 +08:00
    看你的描述像是搞逆向搞外挂。
    xiaotianhu
        2
    xiaotianhu  
    OP
       2021-08-24 16:45:31 +08:00
    @aneostart173 正经大厂的正经项目好伐
    Rwing
        3
    Rwing  
       2021-08-24 16:51:55 +08:00
    欢迎了解一下 C#
    airplayxcom
        4
    airplayxcom  
       2021-08-24 16:59:45 +08:00
    现在这阶段是挺痛苦的,适应一个项目后,你会越用越爽。
    我现在碰都不想碰 PHP
    CodeCodeStudy
        5
    CodeCodeStudy  
       2021-08-24 17:01:32 +08:00
    别 var_dump 了,用断点调试,从 PHP 转 Java 或 C# 的话就容易很多,搞 C++ 的话就相差太多了,建议跑路
    debuggerx
        6
    debuggerx  
       2021-08-24 17:04:12 +08:00
    工具问题
    上 CLion
    sadfQED2
        7
    a href="/member/sadfQED2" class="dark">sadfQED2  
       2021-08-24 17:12:48 +08:00 via Android
    支持 5 楼,都 c++了,就别 var_dump 了,另外,就算是 php,也建议看看 xdebug
    alexkkaa
        8
    alexkkaa  
       2021-08-24 17:30:40 +08:00 via Android   2
    Php 易招黑 处于鄙视链底层。

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

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

    这不是语言的问题,单纯是调试方法论的问题
    joshua7v
        19
    joshua7v  
       2021-08-24 20:17:03 +08:00
    调试工具一定要熟
    毕竟大部分时间都是在调试
    就调试工具来说 windows 上的工具优秀很多
    ReferenceE
        20
    ReferenceE  
       2021-08-24 20:41:18 +08:00 via Android
    转 Java 吧,C#
    @Rwing 都不用
    gBurnX
        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 面板。
    BrettD
        22
    BrettD  
       2021-08-24 21:21:22 +08:00   1
    我觉得你的问题是你在用 PHP 的习惯搞 C++
    cabing
        23
    cabing  
       2021-08-24 22:19:24 +08:00
    日志和 debug 结合一起哦
    ioschina1
        24
    ioschina1  
       2021-08-24 23:06:32 +08:00
    从 php 到 c++的话,会感觉失去了自由
    LxExExl
        25
    LxExExl  
       2021-08-25 02:09:36 +08:00
    我也是从 php 到 c++干了一段时间,实在受不了 c++的一堆桎梏,直接删库跑路,换组了。这辈子再也不碰 c++了。
    gesse
        26
    gesse  
       2021-08-25 06:23:40 +08:00
    Phper 的职业能力能写 c++?
    yEhwG10ZJa83067x
        27
    yEhwG10ZJa83067x  
       2021-08-25 08:25:05 +08:00   1
    @gBurnX 8 个显示器铺开,不知情的还以为你炒股的呢
    raysonlu
        28
    raysonlu  
       2021-08-25 08:54:55 +08:00
    或者外包出去干?
    seakingii
        29
    seakingii  
       2021-08-25 08:55:58 +08:00
    @gBurnX 8 个显示器?这门槛有点高啊....你平时是用几个显示器的....?
    fiypig
        30
    fiypig  
       2021-08-25 08:59:51 +08:00
    哈哈哈 用 PHP 也不打断点的吗
    mirage13
        31
    mirage13  
       2021-08-25 09:02:50 +08:00
    下断点调试啊,先把语法看明白了再搞
    encro
        32
    encro  
       2021-08-25 09:09:47 +08:00
    我从 PHP 写到 C++的最大痛点是:

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

    建议你试试,试一次,你就回不去了。效率提高不知多少。
    sxfscool
        36
    sxfscool  
       2021-08-25 09:34:34 +08:00
    var_dump 这种基于 print 开发也只能动态语言用用了,需要编译的用这个,时间全都在编译上了
    table cellpadding="0" cellspacing="0" border="0" width="100%"> gBurnX
        37
    gBurnX  
       2021-08-25 09:35:01 +08:00
    @seakingii

    门槛不高。

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

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

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

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

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

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

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

    如果写一大串,com.xx.window.open.location.xx. 那不就是 java 了吗 hhh
    xiaotianhu
        48
    xiaotianhu  
    OP
       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
        49
    newmlp  
       2021-08-25 11:23:09 +08:00
    @myd 为什么我感觉我们调试的是两种语言,C++调试可以看到变量类型和值的,即便是字典列表这些也可以啊
    xiaotianhu
        50
    xiaotianhu  
    OP
       2021-08-25 11:28:37 +08:00
    @newmlp 求介绍技巧,发帖就是因为不熟悉 想讨教一下技巧

    所以也是用 GDB 来看? VSCode+GDB 什么的
    gdfsjunjun
        51
    gdfsjunjun  
       2021-08-25 11:32:02 +08:00
    从 C++到 PHP 太轻松了。毕竟大学只教 C++,C++确实难
    newmlp
        52
    newmlp  
       2021-08-25 11:36:46 +08:00
    @xiaotianhu Windows 就用宇宙第一 ide:vs,Linux 下可以用 clion 或者 qtcreator,都是图形化的调试界面,打个断点变量值看的一清二楚
    SmartKeyerror
        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 更舒服,毕竟图形化界面能够承载更多的信息。
    nash
        54
    nash  
       2021-08-25 11:44:30 +08:00
    从外卖员到米其林大厨太痛苦了
    charlie21
        55
    charlie21  
       2021-08-25 11:55:43 +08:00
    是面对全新的问题,其实和语言无关,和过去的一切都无关。迁移能力被严重高估的情况下依然会有人告诉你 “所有编程语言都是图灵等价的” 呸呸呸
    xiaotianhu
        56
    xiaotianhu  
    OP
       2021-08-25 12:33:00 +08:00
    @SmartKeyerror 学习了,这玩意能远程调试吗,就是服务只能启动在远程 Centos 的,本地是 Mac 的情况下。
    encro
        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++理由吧。
    encro
        58
    encro  
       2021-08-25 12:51:12 +08:00
    对于题主问题:

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

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

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

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

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

    conan/vcpkg 相对于 pip/composer/go/rust/ruby 差太多,和 nuget/maven 比起来都有点差距。是万 /千 /百的差距。
    ReferenceE
        72
    ReferenceE  
       2021-08-26 23:56:48 +08:00 via Android
    @X2031 在国内的真没必要学,我钻研了 1 年多,到一工作还是用不上
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2483 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 15:30 PVG 23:30 LAX 08:30 JFK 11:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86