我不是专业的C程序员。我在使用GDB调试程序时遇到了问题。(我要修复的错误与我在此处提问的问题无关。)我的问题是,当我直接从shell运行二进制文件时,程序运行得很好,但当我使用GDB运行它时,程序崩溃了。
以下是一些有用的程序信息:这是一个20多年前为Solaris编写的数据库软件,在Linux上进行了移植,它是setuid(但不是root权限,谢天谢地)。
当程序试图打开一个文件进行写操作时,它会在GDB中崩溃。通过使用GDB,我能够确定崩溃发生的原因是下面的系统调用失败了:
为了澄清:
我不明白为什么这个系统调用会失败,因为 1)运行此程序的用户对包含
是否有任何原因我不能做到呢?
以下是一些有用的程序信息:这是一个20多年前为Solaris编写的数据库软件,在Linux上进行了移植,它是setuid(但不是root权限,谢天谢地)。
当程序试图打开一个文件进行写操作时,它会在GDB中崩溃。通过使用GDB,我能够确定崩溃发生的原因是下面的系统调用失败了:
fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, 0644);
为了澄清:
path
是指一个不存在的锁文件路径。如果该锁文件存在,则程序在调用这个系统调用之前就会干净地关闭。我不明白为什么这个系统调用会失败,因为 1)运行此程序的用户对包含
path
的目录具有rwx权限(我已通过检查存储在path
中的变量的值进行验证),2)当我没有使用GDB进行调试时,程序成功地打开要写入的文件。是否有任何原因我不能做到呢?
sudo su -
切换到了这个程序运行的用户,现在 GDB 可以工作了。请将其作为答案添加,我会接受它。 - jayhendren