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