debugging 如何使用LD_preload进行调试

vbkedwbf  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(136)

我使用LD_PRELOAD用我自己的函数覆盖MPI_Send函数,以便对MPI_send函数进行一些调试。
下面是myMPI_Send. c代码:

#define _GNU_SOURCE
#include <stdio.h>
#include <dlfcn.h>
#include <mpi.h>
#include <stdlib.h>

int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
{
        int (*original_MPI_Send)(const void *, int, MPI_Datatype, int, int, MPI_Comm);    
        original_MPI_Send=dlsym(RTLD_NEXT, "MPI_Send");    
        printf(" Calling MPI_Send ************** \n");    
        return (*original_MPI_Send)(buf, count, datatype, dest, tag, comm);
}

在我的项目中,我使用了一个包含MPI_Send函数的extern库。我需要调试extern库,以了解MPI_Send的每次调用的行数和调用次数。
我尝试使用宏来使用此代码:

fprintf (stderr,"MPI_Send, func <%s>, file %s, line %d, count %d\n",__func__, __FILE__, __LINE__, __COUNTER__);

但是,它不起作用,它总是在myMPI_Send.so中打印MPI_Send行。
你能帮我一下吗?先谢谢你。

gajydyqb

gajydyqb1#

MPI通过MPI分析接口(又称PMPI)满足您的大部分需求。
只需重新定义所需的MPI_*子例程,并让它们调用原始的PMPI_*对应子例程。
在您的情况下:

int MPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
{
        printf(" Calling MPI_Send ************** \n");    
        PMPI_Send(buf, count, datatype, dest, tag, comm);
}

由于您希望打印调用方的行和文件,因此可能必须使用宏并重新构建应用:

#define MPI_Send(buf,count,MPI_Datatype, dest, tag, comm) \
    myMPI_Send(buf, count, MPI_Datatype, dest, tag, comm, __func__, __FILE__, __LINE__)

int myMPI_Send(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, char *func, char *file, int line)
{
        printf(" Calling MPI_Send ************** from %s at %s:%d\n", func, file, line);    
        return PMPI_Send(buf, count, datatype, dest, tag, comm);
}

相关问题