调试器和实际程序的行为不同 [已关闭]

Debugger and actual program doesn't behave the same [closed]

提问人:yazukii 提问时间:11/16/2023 更新时间:11/16/2023 访问量:52

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

6天前关闭。

我正在开发我自己的 shell 实现(与某人一起)这是 git,因为有很多文件可以制作一个最小的、可重现的示例。无论如何,该代码在我伴侣的机器 (Linux) 上完美运行,但在我的机器 (macOS) 上,由于我输入 2 个命令后出现双重释放,它崩溃了。因此,为了找出原因和位置,我启动了调试器(Clion),现在它在请求我的输入(readline)之前会出现段错误。因此,我们现在有三种不同的行为,无论是在他的机器上运行,还是在我的机器上运行,都可以使用调试器。使用调试器逐步查看,它表明它段错误的原因是因为在解析 envp 以将环境变量放在链表中时,envp[0] 没有值: enter image description here.但是,如果不是使用调试器查看 envp[0],而是在没有调试器的情况下从终端启动程序,我会得到 .因此,无论我在有或没有调试器的情况下启动,envp[0] 不仅是一个不同的变量,而且是 envp[36] 并且它有一个值。我还尝试了 lldb 进行调试,认为 Clion 有问题,但我遇到了与 CLion 调试器相同的问题。keyvalueprintf("%s\n", enpv[0]);COLORTERM=truecolor_P9K_SSH_TTY_P9K_SSH_TTY=/dev/ttys000

C shell 调试

评论

3赞 gulpr 11/16/2023
展示实际代码,不描述代码
3赞 Yunnosch 11/16/2023
如果文件太多,则不显示实际的完整代码。争取一个最小的可重现示例,因为您拥有的文件越多,这一点就越重要。如果您认为您不应该或不需要使用更多文件,那么您就误解了 MRE 的想法、目标和优势。
5赞 Yunnosch 11/16/2023
如果三个不同的环境行为不同,你的机器、它们的机器和调试器,那么我敢打赌的是未定义的行为。检查导致它的最容易犯的错误:未启动的变量、数组之外的访问、函数调用的参数类型不正确。
1赞 G.M. 11/16/2023
回复:所以这是第一个要解决的问题,对吧?尝试启用内存清理程序或在 valgrind 下运行等。"... it crashes because of a double free ..."
1赞 Yunnosch 11/16/2023
如果您在双免问题之前遇到段错误,我不会在清理段错误之前为双空问题而烦恼。

答: 暂无答案