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

求助一个无头绪排查的段错误问题

  •  
  •   paparika · 2019-09-02 09:35:51 +08:00 · 4099 次点击
    这是一个创建于 1894 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有两组库 libA 和 libB,分别单独编译到程序 A 和 B 中,均运行正常,但是把 libA 和 libB 一同编译到程序 C 中,且只调用 libA 的函数,运行到特定位置后会报段错误,可能是什么原因,如何排查?

    18 条回复    2019-09-04 14:01:36 +08:00
    wutiantong
        1
    wutiantong  
       2019-09-02 09:59:27 +08:00
    太多原因了,你的描述里几乎没提供什么有效信息啊。
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2019-09-02 10:13:58 +08:00
    “把 libA 和 libB 一同编译到程序 C 中” 隐藏了关键信息
    GeruzoniAnsasu
        3
    GeruzoniAnsasu  
       2019-09-02 10:16:12 +08:00
    (手滑)

    程序 C 肯定不可能是 A+B 把代码放一起就完事,一定有一些跟 A 和 B 都不同的逻辑。问题出在 caller C 上,跟 libA libB 应该都没关系
    paparika
        4
    paparika  
    OP
       2019-09-02 10:19:49 +08:00
    程序 c 里,我基本上就是 main 一进来就调 libA 的函数,别的什么都不做,也崩溃了
    ace00010
        5
    ace00010  
       2019-09-02 10:19:56 +08:00
    单独跑 AB 都没问题的,混合到你的 C 代码就出现了,特定位置出现就用 gdb 调试吧,快很多
    chinuno
        6
    chinuno  
       2019-09-02 10:26:06 +08:00 via Android
    怎么觉得你这是 ab 有同名符号,调用 a 的时候子调用调到 b 的东西去了
    augustheart
        7
    augustheart  
       2019-09-02 10:36:03 +08:00
    内存管理那块出问题吧
    zmxnv123
        8
    zmxnv123  
       2019-09-02 12:25:07 +08:00
    Valgrind 看下有没有内存问题
    wbing
        9
    wbing  
       2019-09-02 12:28:30 +08:00 via iPhone
    以前遇到过类似的情况,liba 和 libb 都是动态库。然后把这两者编译成静态的,再一起编译到 C,就好了
    nicevar
        10
    nicevar  
       2019-09-02 13:37:09 +08:00
    最后应该发现是命名问题导致的
    hsuehsen
        11
    hsuehsen  
       2019-09-02 15:33:28 +08:00
    1. 名字污染
    2. 内存越界
    3. 或者,堆或栈溢出
    katsusan
        12
    katsusan  
       2019-09-02 16:04:42 +08:00 via iPhone
    debug 一下生成的 core 文件看看
    SelFree
        13
    SelFree  
       2019-09-02 16:48:20 +08:00
    stl ?
    hxndg
        14
    hxndg  
       2019-09-02 17:46:21 +08:00
    那你无头绪以后有没有单步跟踪,断点追查呢?
    GDB 啊
    paparika
        15
    paparika  
    OP
       2019-09-02 17:58:57 +08:00
    @hsuehsen @katsusan @hxndg
    调用 libA 后崩溃了,但是 libA 是别人提供的,我这边没法进到里面单步。core 文件看过了,看不到崩溃栈信息,只显示了崩溃函数地址,通过 addr2line 看到崩在 c 标准库里了(这里不清楚为啥 core 看不到崩溃栈调用关系,跟 libA 是否 strip 有关吗?)
    ilotuo
        16
    ilotuo  
       2019-09-02 18:16:33 +08:00
    装个 backtrace 看下
    b00tyhunt3r
        17
    b00tyhunt3r  
       2019-09-04 09:39:24 +08:00 via iPad
    进 liba libb 找找有没有同名全局变量,强符号
    paparika
        18
    paparika  
    OP
       2019-09-04 14:01:36 +08:00
    @b00tyhunt3r 有啥辅助工具吗,里面有很多库,每个库又有很多命名
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2745 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 12:03 · PVG 20:03 · LAX 04:03 · JFK 07:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.