【问题标题】:Segmentation fault error in C program using MQPUT使用 MQPUT 的 C 程序中的分段错误错误
【发布时间】:2017-06-29 07:03:37
【问题描述】:

我下面有一个程序

#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);    
 }     

【问题讨论】:

  • sQueues 库的一部分吗?因为它没有在那里声明。另外,这个函数是怎么调用的? qd 的价值是什么?
  • 检查qd是否超出范围。
  • 我添加了调用程序并在函数中声明了所有变量。请再次检查
  • qd的值=-1
  • 如果您的问题与 IBM MQ 有关,请使用 [ibm-mq] 标签,而不是 [mq] 标签。

标签: c ibm-mq


【解决方案1】:

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

谢谢

【讨论】:

    【解决方案2】:

    这是一些糟糕的代码。

    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 子例程?

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2018-11-18
      • 2011-05-23
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多