Во-первых, есть средство трассировки системы.Я не использовал это много (любой?) Из приложения, но это потокобезопасно.
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.
Обратите внимание, что значение индекса является ключевым в основном файле.Это говорит вам о последней точке входа, которая была достигнута.Затем выполните шаг назад по массиву журнала, чтобы увидеть предыдущие точки журнала.