Вызов библиотеки AIX для получения информации о состоянии - PullRequest
1 голос
/ 24 января 2012

Существуют ли какие-либо вызовы библиотеки времени выполнения AIX, которые я могу использовать в C ++ в AIX для мониторинга состояния потоков, связанных с запущенным процессом?Я пытаюсь решить проблему сбоев при завершении работы, которая, по моему мнению, вызвана выходом программы до того, как все потоки соединились.

Я ценю, что в многопоточной среде будет нелегкоТочно регистрируйте состояние потоков, так как они, возможно, изменились между чтением статуса и его отображением, но что угодно - даже грубое - было бы полезно в качестве первого шага для отслеживания этого.

Ответы [ 2 ]

0 голосов
/ 13 июня 2012

Во-первых, есть средство трассировки системы.Я не использовал это много (любой?) Из приложения, но это потокобезопасно.

http://pic.dhe.ibm.com/infocenter/aix/v6r1/topic/com.ibm.aix.genprogc/doc/genprogc/trace_facility.htm#yg3100thri

и

http://pic.dhe.ibm.com/infocenter/aix/v6r1/topic/com.ibm.aix.genprogc/doc/genprogc/tracing.htm?resultof=%22%61%70%70%6c%69%63%61%74%69%6f%6e%22%20%22%61%70%70%6c%69%63%22%20%22%74%72%61%63%65%22%20

Если это очень сложное приложение, я бы подключил реальные трассировочные хуки иразработать файл формата трассировки.Это будет стоить потраченного времени.Ниже следует более грубый метод.

Способ, которым я, вероятно, отследил бы это, состоит в том, чтобы подключить домашний след или лесозаготовительную фабрику.В коде, посыпать вызовы подпрограммы журнала.Затем вернитесь и осмотрите файл ядра, выкопайте буфер журнала, и он скажет вам последовательность точек журнала, которые вы нажали.

Скорее всего, это будет итеративный процесс, в котором вы добавляете несколько точек, а затем выясняете, что вам нужно больше точек в определенной части кода и добавляете в нее точки журнала.Попробуйте снова.повторить.

Процедура регистрации очень проста и использует один из атомарных операций.Я использую 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.

Обратите внимание, что значение индекса является ключевым в основном файле.Это говорит вам о последней точке входа, которая была достигнута.Затем выполните шаг назад по массиву журнала, чтобы увидеть предыдущие точки журнала.

0 голосов
/ 13 июня 2012

Вы сказали "сбой при завершении работы" ... вы имеете в виду сбой системы с аварийным дампом? Если это так, то у вас есть тонны и тонны данных. Если вам нужно, я бы запустил трассировку системы сбольшой буфер. После сбоя системы и перезагрузки вы можете извлечь буфер трассировки из дампа, используя trcdead. Кроме того, у вас есть состояние системы.

Не должно быть, что тупые потоки вызывают сбой системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...