天天看點

libmemcached的調試

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調試該程式了。

繼續閱讀