我不是专家 C 程序员。我在使用 GDB 调试程序时遇到问题。(我试图修复的错误与我在这里询问的问题无关。)我的问题是当我直接从 shell 运行二进制文件时程序运行良好,但是当我使用 GDB 运行它时程序崩溃。
以下是有关该程序的一些可能有用的信息:它是一个有 20 多年历史的数据库软件,最初是为 Solaris 编写的(我认为),但后来移植到 Linux,它是 setuid(但不是 root,感谢上帝) .
尝试打开文件进行写入时,程序在 GDB 中崩溃。使用 GDB,我能够确定发生崩溃是因为以下系统调用失败:
fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644);
为了澄清:path
是不应该存在的锁定文件的路径。如果锁文件存在,那么程序在到达这个系统调用之前就彻底关闭了。
我不明白为什么这个系统调用会失败,因为 1)这个程序运行的用户对包含的目录具有 rwx 权限path
(我已经通过检查存储在 中的变量的值来验证这一点path
),以及 2)程序成功打开当我不使用 GDB 调试它时要写入的文件。
有什么理由我不能