libmemcached的调试

本文介绍了如何配置和使用gdb调试libmemcached。在libmemcached版本1.0.3上,通过修改Makefile添加-g -O0标志以支持调试,并设置环境变量以链接库文件。此外,还讲解了如何编译测试主程序并用gdb进行调试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、libmemcached的调试

libmemcached的版本:1.0.3

./configure之后将Makefile中的CFLAGS、CPPFLAGS、CXXFLAGS都加上-g -O0之后就可以使用gdb进行调试了。


2、测试主程序

分别给出C版和C++版:

// libmemcached_test.c
 
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <libmemcached/memcached.h>
 
int main(void) {
  memcached_st *memc;
  memcached_server_st *servers = NULL;
  memcached_return rc;
  const char* server_list = "localhost:11211";
  const char* key= "key";
  const char* value= "value";
  char* retval = NULL;
  size_t len = 0;
  time_t expire = 0;
  uint32_t flags = 0;
 

  memc = memcached_create(NULL);
  servers = memcached_servers_parse(server_list);
  rc = memcached_server_push(memc, servers);
  memcached_server_list_free(servers);  
  if(rc == MEMCACHED_SUCCESS) {
    printf("added server successfully\n");
  } else {
    printf("couldn't add server: %s\n", memcached_strerror(memc, rc));
  }
 
  // set
  rc = memcached_set(memc, key, strlen(key), value, strlen(value), expire, flags);
  if(rc == MEMCACHED_SUCCESS) {
    printf("key stored successfully\n");
  } else {
    printf("couldn't store key: %s\n", memcached_strerror(memc, rc));
  }
 
  // get
  retval = memcached_get(memc, key, strlen(key), &len, &flags, &rc);
  if(rc == MEMCACHED_SUCCESS) {
    printf("key got successfully\n");
    printf("value: %s\n", retval);
  } else {
    printf("couldn't get key: %s\n", memcached_strerror(memc, rc));
  }
  free(retval); 
 
  // delete
  rc = memcached_delete(memc, key, strlen(key), expire);
  if(rc == MEMCACHED_SUCCESS) {
    printf("key deleted successfully\n");
  } else {
    printf("couldn't delete key: %s\n", memcached_strerror(memc, rc));
  }
 
  // get
  retval = memcached_get(memc, key, strlen(key), &len, &flags, &rc);
  if(rc == MEMCACHED_SUCCESS) {
    printf("key got successfully\n");
    printf("value: %s\n", retval);
  } else if(rc == MEMCACHED_NOTFOUND) {  
    printf("couldn't get key (not found): %s\n", memcached_strerror(memc, rc));
  } else if(rc == MEMCACHED_FAILURE) {  
    printf("couldn't get key (failure): %s\n", memcached_strerror(memc, rc));
  }
  free(retval);
 
  
  memcached_free(memc);
  return 0;
}

#include <iostream>

#include <libmemcached/memcached.hpp>   //该头文件内部也包含了<libmemcached-1.0/memcached.h>,并在memcache命名空间中定义了class Memcache
 
int main(void) {
  using namespace std;
//  try {
    memcache::Memcache memc("127.0.0.1", 11211);
    string key = "mykey1";
    string value_str = "myvalue1";

    vector<char> value(value_str.begin(), value_str.end());
    vector<char> retval;
    time_t expire = 0;
    uint32_t flags = 0;
 
    // set
    //   bool set(const std::string &key, const std::vector<char> &value,
    //            time_t expiration, uint32_t flags)
    if(memc.set(key, value, expire, flags)) {
      cout<<"key stored successfully"<<endl;
    } else {
      cerr<<"couldn't store key"<<endl;
    }
 
    // get
    //   bool get(const std::string &key, std::vector<char> &ret_val)
    if(memc.get(key, retval)) {
      cout<<"key got successfully"<<endl;
      cout<<&retval[0]<<endl;
    } else {
      cerr<<"couldn't get key"<<endl;
    }
 
    // delete
    //   bool remove(const std::string &key)
    if(memc.remove(key)) {
      cout<<"key deleted successfully"<<endl;
    } else {
      cerr<<"couldn't delete key"<<endl;
    }
//  } catch(const memcache::Error& e) {
//    cerr<<"catch exception"<<endl;
//    cerr<<e.what()<<endl;
//    cerr<<e.getErrno()<<endl;
//  }
  return 0;
}
由于我的libmemcached默认安装到/usr/local/libmemcached/,所以添加环境变量:

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/libmemcached/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/local/libmemcached/lib
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/libmemcached/include
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/libmemcached/include

g++ test.cpp  -g -O0 -o test -lmemcached就可以gdb调试该程序了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值