我是否可以在AIX上的C ++中使用任何AIX运行时库调用来监视与正在运行的进程相关联的线程的状态?我正在尝试解决崩溃关闭问题,我认为该问题是由程序在所有线程加入之前退出引起的。
我很欣赏在多线程环境中,准确记录线程的状态并不容易,因为它们在读取状态和显示之间可能已经发生了变化,但是任何东西 - 无论多么粗糙 - 都可以用作追踪这一点的第一步。
答案 0 :(得分:0)
你说“崩溃关机”...你的意思是系统崩溃与崩溃转储?如果是这样,那么你有大量的数据。如果你需要,我会用一个系统跟踪系统崩溃并重新启动后,您可以使用trcdead从转储中获取跟踪缓冲区。再加上系统的状态。
不应该是愚蠢的线程导致系统崩溃。
答案 1 :(得分:0)
首先,有一个系统跟踪工具。我没有从应用程序中使用它(任何?)但它是线程安全的。
和
如果这是一个非常复杂的应用程序,我会连接真正的跟踪钩子并开发一个跟踪格式文件。值得花时间。以下内容是一种较为粗俗的方法。
我可能追踪这个问题的方法是连接一个本土的跟踪或日志工具。在代码中,请调用日志例程。然后返回并检查核心文件,挖出日志缓冲区,这将告诉您所点击的日志点序列。
这可能是一个迭代过程,您可以在其中添加几个点,然后在代码的特定部分中需要更多的点并在那里添加日志点。再试一次。重复。
日志例程实际上非常简单,并利用其中一个原子操作。我正在使用fetch_and_add。
long array[4096]; /* some power of 2 in size is my preference */
unsigned int index; /* int -- not a long */
/* trace 5 words each time. */
void log(long *a, long b, long c, long d, long e)
{
/*
* the 5 equals the number of args. The 4095 is one less than the
* size of the array. You can use mod if you want. Also, note that
* there are flavors of fetch_and_add for different sized
* variables. Pick the one that matches the size of index.
*/
int i = fetch_and_add(&indx, 5) & 4095;
/*
* at this point, array[i] ... array[i+4] have been effectively
* reserved. The time taken between the fetch_and_add and updating
* the array does not need to be atomic or locked. The only
* possible exception is you don't want the log to wrap within this
* time but that would be very unlikely.
*/
array[i] = *a;
array[i+1] = b;
array[i+2] = c;
array[i+3] = d;
array[i+4] = e;
}
/* your original code spinkle calls to log */
int whatever(long arg1, int arg2)
{
log("WHT1", arg1, arg2, 0, 0);
foo = apple + pie;
bar = whisky + good;
dog = nice + pet;
cat = meow;
log("WHT2", foo, bar, log, dog);
/* ... */
}
第一个参数的技巧是,当你获得核心文件并转储数组时,可以将其作为十六进制和文本转储。从文本输出中,您可以快速查看正在调用的日志点。如果您有64位应用程序,而不是将自己限制为4个字符,则可以使用8。
请注意,index的值是核心文件中的键。这告诉你最后一个被击中的日志点。然后向后退一步,查看以前的日志点。