运行 C 程序使用 systemd 时的核心转储
Core dump when running C program using systemd
我有一个 C 语言程序,当 运行 直接从命令行对其进行 运行 运行时它运行良好,但当 运行 使用 systemd 对其进行运行时 运行 运行失败:
Core was generated by `/usr/local/bin/midnite-modbusd'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0 0x0000000000401308 in main (argc=1, argv=0x7ffeae390268) at src/midnite-modbusd.c:139
139 slen= interval - (millis % interval);
有问题的代码:
//wait for start of each sample interval
gettimeofday(&tv,NULL);
millis= (long long unsigned)tv.tv_sec*1000 + (tv.tv_usec/1000);
slen= interval - (millis % interval);
i= (millis+slen) % 1000;
usleep (slen*1000);
系统单位:
[Unit]
Description=Midnite Classic modbus data polling
After=network.target
[Service]
Type=simple
User=midnite-modbusd
ExecStart=/usr/local/bin/midnite-modbusd
Restart=on-failure
[Install]
WantedBy=multi-user.target
程序 运行 与 systemd 有什么不同?
编辑 1
看来我的程序有重大问题,只有在 运行 systemd:
时才会发生
- 它不会读取我的配置文件,它应该会抛出一条错误消息并且
exit(1)
because of invalid values
- journactl 不会实时填充。使用
journactl -f
我必须等待几分钟才能看到突然出现的一堆日志
作为我使用命令行测试的旁注 I 运行: sudo -H -u midnite-modbusd /usr/local/bin/midnite-modbusd
配置文件中定义的sample_interval值会初始化interval,请检查文件是否正确sample_interval 存在。 interval 的未初始化值可能会导致被零除异常
我在这段代码中发现了问题:
if (getppid()==1) {
sprintf(str, "Daemon aready running");
log_message(log_file_path,(char*)str);
return;
}
当程序打算将自身作为 "old style" 守护进程派生到 运行 时,此代码出现在此处。
我没有意识到,因为 systemd 正在分叉它,所以程序有一个父进程(因此 getppid()
返回 1
当 运行 systemd 但不是来自命令行时)
反正写的不好:这个测试应该停止脚本。
我有一个 C 语言程序,当 运行 直接从命令行对其进行 运行 运行时它运行良好,但当 运行 使用 systemd 对其进行运行时 运行 运行失败:
Core was generated by `/usr/local/bin/midnite-modbusd'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0 0x0000000000401308 in main (argc=1, argv=0x7ffeae390268) at src/midnite-modbusd.c:139
139 slen= interval - (millis % interval);
有问题的代码:
//wait for start of each sample interval
gettimeofday(&tv,NULL);
millis= (long long unsigned)tv.tv_sec*1000 + (tv.tv_usec/1000);
slen= interval - (millis % interval);
i= (millis+slen) % 1000;
usleep (slen*1000);
系统单位:
[Unit]
Description=Midnite Classic modbus data polling
After=network.target
[Service]
Type=simple
User=midnite-modbusd
ExecStart=/usr/local/bin/midnite-modbusd
Restart=on-failure
[Install]
WantedBy=multi-user.target
程序 运行 与 systemd 有什么不同?
编辑 1
看来我的程序有重大问题,只有在 运行 systemd:
时才会发生- 它不会读取我的配置文件,它应该会抛出一条错误消息并且
exit(1)
because of invalid values - journactl 不会实时填充。使用
journactl -f
我必须等待几分钟才能看到突然出现的一堆日志
作为我使用命令行测试的旁注 I 运行: sudo -H -u midnite-modbusd /usr/local/bin/midnite-modbusd
配置文件中定义的sample_interval值会初始化interval,请检查文件是否正确sample_interval 存在。 interval 的未初始化值可能会导致被零除异常
我在这段代码中发现了问题:
if (getppid()==1) {
sprintf(str, "Daemon aready running");
log_message(log_file_path,(char*)str);
return;
}
当程序打算将自身作为 "old style" 守护进程派生到 运行 时,此代码出现在此处。
我没有意识到,因为 systemd 正在分叉它,所以程序有一个父进程(因此 getppid()
返回 1
当 运行 systemd 但不是来自命令行时)
反正写的不好:这个测试应该停止脚本。