2017-05-28 311 views
1

我正在尝试调试一个程序。有一种被称为prv_write()如何在c中打印struct成员的值(用指向结构的指针)

static uint8_t prv_write(uint16_t instanceId, 
        int numData, 
        lwm2m_data_t * dataArray, 
        lwm2m_object_t * objectP) 

此功能被传递(第三个参数)的指针,结构lwm2m_data_t其定义为函数:

typedef struct _lwm2m_data_t lwm2m_data_t; 

struct _lwm2m_data_t 
{ 
    lwm2m_data_type_t type; 
    uint16_t id; 
    union 
    { 
     bool  asBoolean; 
     int64_t  asInteger; 
     double  asFloat; 
     struct 
     { 
      size_t length; 
      uint8_t * buffer; 
     } asBuffer; 
     struct 
     { 
      size_t   count; 
      lwm2m_data_t * array; 
     } asChildren; 
     struct 
     { 
      uint16_t objectId; 
      uint16_t objectInstanceId; 
     } asObjLink; 
    } value; 
}; 

有人能解释我怎么能打印值lengthbuffer里面的函数prv_write()?在这个阶段,我不是很了解结构内部的结构。

理想情况下,我想打印所有结构成员的值,以便我可以完全调试系统。

回答

2

以及打印它,你可以简单地做:

for (int i=0; i<dataArray->value.asbuffer.length; ++i) 
    printf("%d ", dataArray->value.asBuffer.buffer[i]); 
printf("\n"); 

,如果你需要做的是在你的代码的几个地方,你可以为宏:

#define SHOW_LWM2M_DATA(DA) do { \ 
    for (int i=0; i< (DA)->value.asbuffer.length; ++i) \ 
     printf("%d", (DA)->value.asBuffer.buffer[i]); \ 
    printf("\n"); } while (0) 

(中do { } while(0)只是为了使宏表现像一个正常的功能)

并在代码的很多地方使用该宏,因为它演变为:

pipSHOW_LWM2M_DATA(dataArray); 

,但如果你要反思的那部分代码,我给你的建议是使用gdb(或lldb),并设置一个观察点或断点使用其print功能来查找值,它将打印结构和数组很容易。

+0

•为什么使用宏而不是函数? •缺少正确的“类型”检查。 •宏参数必须括在括号内。 •'%d'后应该有一个空格。 –

+0

→OP明确表示他想调试/内省一些代码,所以作为一个丢弃工具,一个宏将填补这项工作。但我同意一个功能很好地填补了这项工作。 →其余的,谢谢它是固定的。 – zmo

+0

您只修复了我提到的三件事之一,因此在调用具有错误类型的数据对象时,代码仍会调用未定义的行为。 –