使用MQPUT的C程序中的分段错误错误

时间:2017-06-28 15:33:48

标签: c ibm-mq

我有一个程序

#include <stdio.h>    
#include <cmqc.h>    
#include <cmqxc.h>    
#include "dte_mq.h"    
#include <string.h>    
#include <stdlib.h>    

typedef struct tagDTE_QUEUE_DESCRIPTOR    
{    
    MQHOBJ handle;    
    int    IsSyncpointControled;    
} DTE_QUEUE_DESCRIPTOR, *PDTE_QUEUE_DESCRIPTOR;    
static MQHCONN sHConn = 0;    
static MQLONG  sCompCode = MQCC_OK;    
static MQLONG  sReason = MQRC_NONE;    
static int     sNumOpenQueues = 0;    
static PDTE_QUEUE_DESCRIPTOR sQueues = NULL;   
MQLONG   OpenCode;    
MQOD     od = {MQOD_DEFAULT};    /* Object Descriptor */    
MQMD     md = {MQMD_DEFAULT};    
MQPMO    pmo = {MQPMO_DEFAULT};    
MQLONG   O_options;    
MQLONG   C_options;     
MQGMO   gmo = {MQGMO_DEFAULT};    
/* MQCONNX options */    
MQCNO   Connect_options = {MQCNO_DEFAULT};    
/* Client connection channel */    
MQCD    ClientConn = {MQCD_CLIENT_CONN_DEFAULT};    

DTE_MQ_RESULT dteMqSend(int qd, void *buf, int len)    
{   
printf("oleg\n");    
/* memcpy(md.Format, MQFMT_STRING, MQ_FORMAT_LENGTH); */    
    md.MsgType  = MQMT_DATAGRAM;    
printf("oleg1\n");    
   memcpy(md.MsgId, MQMI_NONE, sizeof(md.MsgId));    
printf("oleg2\n");    
   memcpy(md.CorrelId, MQCI_NONE, sizeof(md.CorrelId));    
printf("oleg3\n");    
   memcpy(md.Format, MQFMT_STRING, (size_t)MQ_FORMAT_LENGTH);    
printf("oleg4\n");    

   if(sQueues[qd].IsSyncpointControled)    
      pmo.Options |= MQPMO_SYNCPOINT;    
printf("oleg5\n");    
   MQPUT(sHConn, sQueues[qd].handle, &md, &pmo, len, buf, &sCompCode, &sReason);    
   printf("MQput CC=%ld RC=%ld\n", sCompCode, sReason);    
   if (sCompCode != MQCC_OK) return DTE_MQR_FAILED;    

   return DTE_MQR_OK;    
}    

我把print语句发现在printf之后(“oleg4 \ n”;)我得到错误
    分段错误

你能帮我调试一下程序吗?我必须使用malloc作为结构吗?它用C语言编写并使用MQPUT

下面是一个程序,其中称为上面的函数

#include <stdio.h>    
#include <stdlib.h>    
#include <string.h>    

#include <cmqc.h>            /* includes for MQI          */    
#include <cmqxc.h>    


int main(int argc, char **argv)    
{    
    MQLONG   messlen;                /* message length received       */    

    char     QMgrName[MQ_Q_MGR_NAME_LENGTH+1];    
    char     QName[MQ_Q_NAME_LENGTH+1];    
    char     channelName[MQ_CHANNEL_NAME_LENGTH+1];    
    char     hostname[1024];    
    char     port[4];    
    MQLONG   buflen;    
    MQBYTE   TmpBuf[65536] = "This is a simple test message.";    
    int msgsToGet;    
    int msgsGot;    
    int dteretinit;    
    int dteretdeinit;    
    int dteretopen;    
    int dteretclose;    
    int qd;    
    int dteretput;    

    if (argc != 6)    
    {  
        printf("Usage: NewMQTest QMgrName ChlName hostname port  QName\n");    
        exit(-1);    
    }    


    strncpy(QMgrName, argv[1], MQ_Q_MGR_NAME_LENGTH);    
    QMgrName[MQ_Q_MGR_NAME_LENGTH] = '\0';    

    strncpy(channelName, argv[2], MQ_CHANNEL_NAME_LENGTH);    
    channelName[MQ_CHANNEL_NAME_LENGTH] = '\0';    

    strncpy(hostname, argv[3], 1023);    
    hostname[1023] = '\0';    

    strncpy(port,argv[4],4);    

    strncpy(QName, argv[5], MQ_Q_NAME_LENGTH);    
    QName[MQ_Q_NAME_LENGTH] = '\0';    

    dteretinit = dteMqInit(QMgrName,hostname,channelName);    
    printf("Return code from dteMqInit = %d\n",dteretinit);    
    qd = -1;    
    dteretopen = dteMqOpen(QName, qd);    
    printf ("Return code from dteMqOpen = %d\n",dteretopen);    

   if (dteretopen == 0 )    
   {    
       buflen = strlen(TmpBuf);    
       TmpBuf[buflen + 1] = '\0';    
       dteretput = dteMqSend(qd,*TmpBuf,buflen);    
       printf("return mqput %d\n",dteretput);    
   }    
   dteretclose = dteMqClose(qd);    
   printf("Return code from dteMqClose = %d\n",dteretclose);    

   dteretdeinit = dteMqDeinit();    
   printf("Return code from dteMqDeinit = %d\n",dteretdeinit);    
 }     

2 个答案:

答案 0 :(得分:0)

我分析了我的程序并检查了MQ。 SSL没有让我连接到MQ,这就是我无法更改qd的原因。该程序非常老,当失败时,返回值设置为0,1成功。我从来没有这样做过。 0总是成功的。

谢谢

答案 1 :(得分:0)

这是一些不好的代码。

typedef struct tagDTE_QUEUE_DESCRIPTOR
{
    MQHOBJ handle;
    int    IsSyncpointControled;
} DTE_QUEUE_DESCRIPTOR, *PDTE_QUEUE_DESCRIPTOR;

static PDTE_QUEUE_DESCRIPTOR sQueues = NULL;

if(sQueues[qd].IsSyncpointControled)

在您发布的代码中,'sQueues'从未设置,因此这就是在'if'语句中抛出分段错误的原因。如果'qd'根据你的评论真的是'-1',那么我不得不想知道你在做什么。

dteretinit = dteMqInit(QMgrName,hostname,channelName);

为什么不将端口号传递给dteMqInit子程序?