用 GDB 调试动态链接库

前言 写本文的目的是为了记录一个【基于 GDB 对动态链接库(DSO1)的错误进行调试】的过程,重要的内容包括: 获取进程发生错误时的状态; 查看进程在该状态下的内存分布; 在 GDB 中用正确地址加载符号表,以恢复函数调用堆栈。 本文主要参考了 Ubuntu Wiki 上的这篇博文 。按照其版权及许可证要求,本文采用 Creative Commons Attribution-ShareAlike 3.0 进行许可。 Hybris 简介 Libhybris 是一种关于 libc 库兼容问题的解决方案,让我们在基于 GNU C Library (Glibc)的系统上2可以运行用 Bionic 编译的库(主要是 Android …

【C++ 小问答】4:数值运算中的小类型隐式转换

问 如下哪段代码有整数溢出: 1int Func(short a, short b) 2{ 3 return (a + b); 4} 1int Func(signed char a, signed char b) 2{ 3 return (a + b); 4} 1long long int Func(int a, int b) 2{ 3 return (a + b); 4} 1long long int Func(int a, int b) 2{ 3 return ((long long int)a + b); 4} 答 导致整数溢出最常见的场景,是在数值计算中没有对较小类型的操作数做恰当的类型转换1。而上述的前三段代码看起来都涉及 …

打印 C++ 类的内存排布

C++ 类的各个成员在内存中的布局,一般是通过理论推导和各种旁敲侧击的手段来大致得出的。实际上,我们可以获得更全面,更确信的材料:让编译器直接告诉我们某个类在内存中的实际排布。 MSVC 在 Visual Studio 中添加 /d1 reportAllClassLayout 或 /d1 reportSingleClassLayout<类名> 这两个编译参数:前者打印所有类,后者打印某一个类。以此代码为例: 1class Base { 2public: 3 Base() : a(0) {} 4 virtual ~Base() {}; 5 6 virtual void Func1() {}; 7 virtual void …

【C++ 小问答】3:未定义的 `Constexpr` 函数

问 下面哪些在编译期报错(非链接期): 1constexpr int GetVal(); 2constexpr int GetVal() { return 0; } 3constexpr int i = GetVal(); 1constexpr int GetVal(); 2constexpr int i = GetVal(); 1constexpr int GetVal(); 2int i = GetVal(); 1constexpr int GetVal(); 2constexpr int i = GetVal(); 3constexpr int GetVal() { return 0; } 答 将这几段代码分别用 g++ -c …

【C++ 小问答】2:平台对隐式类型转换的影响

问 一个经典问题: 1unsigned int a = ...; 2long b = ...; 3auto c = a + b; // 此处 auto 会推导出什么类型? 答 写了段粗糙的测试代码: 1#include <iostream> 2#include <typeinfo> 3 4int main() 5{ 6 unsigned int var_a = 4; 7 long var_b = 5; 8 auto var_c = var_a + var_b; 9 ::std::cout << "var_a: " << typeid(var_a).name() …