----- Original Message ----- > From: "Xi Ruoyao" <ryxi@xxxxxxxxxxxxxxxxx> > To: "Xiaoli Feng" <xifeng@xxxxxxxxxx>, "Mason" <slash.tmp@xxxxxxx> > Cc: ryxi@xxxxxxxxxxxxxxxxx, "GCC help" <gcc-help@xxxxxxxxxxx> > Sent: Monday, July 31, 2017 7:04:42 PM > Subject: Re: gcov can't collect data when process is executed by systemctl start but it can when executed by > ./process > > On 2017-07-31一的 06:05 -0400, Xiaoli Feng wrote: > > > > ----- Original Message ----- > > > From: "Mason" <slash.tmp@xxxxxxx> > > > To: "Xiaoli Feng" <xifeng@xxxxxxxxxx> > > > Cc: "GCC help" <gcc-help@xxxxxxxxxxx> > > > Sent: Monday, July 31, 2017 5:12:38 PM > > > Subject: Re: gcov can't collect data when process is executed by > > > systemctl start but it can when executed by > > > ./process > > > > > > On 31/07/2017 10:57, Xiaoli Feng wrote: > > > > Hello, > > > > > > > > Sorry to noise you. But I don't know how to fixed this issue. The > > > > gcov > > > > can > > > > collect code coverage data if the process is executed in shell. But > > > > when > > > > the process is start by systemd service. The *.gcda can't be generated. > > > > I > > > > google > > > > many info. But there is no solution. So I only send mail to ask for > > > > your > > > > help. > > > > Does any one know what's happen? And where to find the gcov error > > > > message? > > By default systemd terminates a service by sending SIGTERM. > (See systemd.kill(5).) If your service doesn't handle it and will just be > killed, it won't produce .gcda file. > > Your service should handle SIGTERM and terminate cleanly, like: > > void handler(int signum) > { > /* notify the operator that the service has receive SIGTERM > and clean up (close file descriptors, etc). */ > > exit(0); > } > > int main(int argc, char **argv) > { > signal(handler, SIGTERM); > > /* do service */ > } > > By using exit(), the functions registered by atexit() and on_exit() would be > called. GCC registers one atexit function to produce .gcda file. > > Even if without gcov, it's recommended to catch SIGTERM and terminate your > service cleanly. Thanks Xi Ruoyao so much. I have a question. Is *.gcda file only created when process exit? I did a test. Ran the process. Keep it running. Then check if *.gcda is generated. And it did acturally. So if it is started by systemd. And keep running. I think it will generate *.gcda. But it doesn't. I check the namespaces of two processes. They are the same. > > > > > If I send the wrong email address. Sorry about that. > > This is the correct mail list to request help using GCC. And I think maybe > we should document this issue somewhere (in 'info gcc' or GCC wiki). > > > > Could it be that when the process is run by systemd, it runs > > > under a different user id, one which is not allowed to write > > > to the directory? > > > > I don't think so. I run "ps -aux". And it shows the process's USER is > > root. > > Do you know if there is a method to check the error info when generate > > *.gcda? > > And if it is under a different user. How could I change the writing > > directory > > location? > > If I am correct, there should be no error info available since the process > was > killed suddenly and had no chance to print out something. > > > Thanks Mason for your reply. > > > > > > > > Regards. > > > > -- > Xi Ruoyao <ryxi@xxxxxxxxxxxxxxxxx> > School of Aerospace Science and Technology, Xidian University >