I have spent some time testing PCD and I like what it has to offer. I am developing for an embedded system running Ubuntu 8.04 LTS on an Intel architecture. At the moment I am most interested in the segmentation fault handling so that I can track down some intermittent problems.
I am able to start PCD from the command line, and then execute a process with a segmentation fault. From there I am able to use the PCD output to track down the file and line number where the error occurs.
However, for the life of me, I cannot get PCD to work how I want when I auto-start it. I have created a startup script that is supposed to output to a folder with R/W/X permissions for everyone (777, at least until I get something working):
And I have verified that PCD is running after boot. I have also called "PCD_API_REGISTER_EXCEPTION_HANDLERS()" to make my process use the exception handlers provided by PCD (and again, I verified that this works when I start PCD from the command line).
However, when I run the same seg-faulting app after startup, I do not see my error file get populated. Then I start seeing the following error in my output file: "Error: Failed to start IPC." I have also seen "Error removing old socket", indicating a socket access issue.
Am I making an obvious mistake? Do you have an example of a proper startup script?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
The PCD was designed and developed to run on embedded platforms with uClibc/Busybox. I'm glad that it works for you in the command line, but I'm not sure why it doesn't work on your environment when you try to use start up scripts (nor I have any way to debug it).
If you'll find a solution or workaround I'll appreciate if you'd share it with us.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
This issue is caused by IPC_UNIX_PATH "/var/tmp/pcd-server.ctl":
if IPC_SOCKET_PATH folder/path "/var/tmp" does NOT exist, IPC socket bind will fail.
We could create IPC_SOCKET_PATH folder/path manually:
@@ -122,7 +122,7 @@
* \brief The path for the IPC sockets (platform depended - can be overridden by the makefile) /
#ifndef IPC_SOCKET_PATH
-#define IPC_SOCKET_PATH "/var/tmp"
+#define IPC_SOCKET_PATH "/var/pcd"
#endif / IPC_SOCKET_PATH */
Hi,
I have spent some time testing PCD and I like what it has to offer. I am developing for an embedded system running Ubuntu 8.04 LTS on an Intel architecture. At the moment I am most interested in the segmentation fault handling so that I can track down some intermittent problems.
I am able to start PCD from the command line, and then execute a process with a segmentation fault. From there I am able to use the PCD output to track down the file and line number where the error occurs.
However, for the life of me, I cannot get PCD to work how I want when I auto-start it. I have created a startup script that is supposed to output to a folder with R/W/X permissions for everyone (777, at least until I get something working):
#! /bin/sh /usr/sbin/pcd -e /segFaultLogs/segFault.log -c
I have registered it for startup:
And I have verified that PCD is running after boot. I have also called "PCD_API_REGISTER_EXCEPTION_HANDLERS()" to make my process use the exception handlers provided by PCD (and again, I verified that this works when I start PCD from the command line).
However, when I run the same seg-faulting app after startup, I do not see my error file get populated. Then I start seeing the following error in my output file: "Error: Failed to start IPC." I have also seen "Error removing old socket", indicating a socket access issue.
Am I making an obvious mistake? Do you have an example of a proper startup script?
Hi,
The PCD was designed and developed to run on embedded platforms with uClibc/Busybox. I'm glad that it works for you in the command line, but I'm not sure why it doesn't work on your environment when you try to use start up scripts (nor I have any way to debug it).
If you'll find a solution or workaround I'll appreciate if you'd share it with us.
This issue is caused by IPC_UNIX_PATH "/var/tmp/pcd-server.ctl":
if IPC_SOCKET_PATH folder/path "/var/tmp" does NOT exist, IPC socket bind will fail.
We could create IPC_SOCKET_PATH folder/path manually:
@@ -122,7 +122,7 @@
* \brief The path for the IPC sockets (platform depended - can be overridden by the makefile)
/
#ifndef IPC_SOCKET_PATH
-#define IPC_SOCKET_PATH "/var/tmp"
+#define IPC_SOCKET_PATH "/var/pcd"
#endif / IPC_SOCKET_PATH */
/*! \def IPC_UNIX_PATH_MAX
@@ -305,6 +305,7 @@
struct sockaddr_un sun;
int32_t fd;
int32_t i = 0;
+ char cmd_sun_path[IPC_UNIX_PATH_MAX];
@@ -348,15 +349,20 @@
pthread_mutex_unlock( &IPC_Clients->lock );
return IPC_STATUS_NOK;
}
+
+ bzero(&sun, sizeof(struct sockaddr_un));
sun.sun_family = AF_UNIX;
snprintf( sun.sun_path, IPC_UNIX_PATH_MAX, "%s/%s.ctl", IPC_SOCKET_PATH, myName );
+ snprintf( cmd_sun_path, IPC_UNIX_PATH_MAX, "mkdir -p %s", IPC_SOCKET_PATH);
+ system(cmd_sun_path);