V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaotianhu
V2EX  ›  程序员

从 PHP 到 C++太痛苦了

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

    小白一个,接手两个『挺大』的 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
    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++?🐶🐶🐶
    justrand
        27
    justrand  
       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 开发也只能动态语言用用了,需要编译的用这个,时间全都在编译上了
    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 好用
    justrand
        40
    justrand  
       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,另外的帖子 https://www.v2ex.com/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   ·   我们的愿景   ·   实用小工具   ·   5503 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 09:03 · PVG 17:03 · LAX 02:03 · JFK 05:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.