私は専門の C プログラマーではありません。GDB を使用したプログラムのデバッグに問題があります。(私が修正しようとしているバグは、ここで質問している問題とは関係ありません。) 私の問題は、バイナリをシェルから直接実行するとプログラムが正常に動作するのに、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を使用してデバッグしていないときに書き込むためのファイル。
できない理由があるのですか