����Linux�Ż�
Linux����

����һ��Linux���������ţ�����������

����ʱ��:2017-10-07 09:14:29��Դ:linux.cn����:LCTT
������͵͵�����ġ���ʱ�����ǻ�ܸ��˵ش��ڼĴ����У�����һתͷ�ͻ��ܵ���ջ�С�Ϊ���Ż������������ܻ���ȫ�����ǴӴ������׳������۱������ڴ��е�����ƶ������Ƕ���ҪһЩ�����ڵ������и��ٺͲ������ǡ���ƪ���½��������δ����������еı�������ʹ�� libelfin ��ʾһ���򵥵�ʵ�֡�
ϵ����������
׼��������//m.ajphoenix.com/linux/31643.html��
�ϵ㣨//m.ajphoenix.com/linux/31737.html��
�Ĵ������ڴ棨//m.ajphoenix.com/linux/31847.html��
Դ����źţ�//m.ajphoenix.com/linux/32098.html��
Դ�뼶��ִ�У�//m.ajphoenix.com/linux/32424.html��
Դ�뼶�ϵ㣨//m.ajphoenix.com/linux/32650.html��
��ջչ����//m.ajphoenix.com/linux/32724.html��
��������
�߼�����
�ڿ�ʼ֮ǰ����ȷ����ʹ�õ� libelfin �汾���ҷ�֧�ϵ� fbreg���������һЩ hack ��֧�ֻ�ȡ��ǰ��ջ֡�Ļ�ַ������λ���б�����Щ��������ԭ���� libelfin �ṩ�ġ��������Ҫ�� GCC ���� -gdwarf-2 ����ʹ�����ɼ��ݵ� DWARF ��Ϣ��������ʵ��֮ǰ���ҽ���ϸ˵�� DWARF 5 ���¹淶�е�λ�ñ��뷽ʽ���������Ҫ�˽������Ϣ����ô����Դ� http://dwarfstd.org/ ��ȡ�ñ�׼��
 
DWARF �
ijһ����ʱ�̵��ڴ��б�����λ��ʹ�� DW_AT_location ���Ա����� DWARF ��Ϣ�С�λ�����������ǵ���λ������������λ��������λ���б���
��λ�������������˶����һ��​​�����IJ��֣�ͨ�������в��֣���λ�á���λ����������������Ѱַ�洢����Ĵ����е�λ�ã���ȱ��λ�ã����л򲻾�����ֵ֪�������磬DW_OP_fbreg -32�� һ�������洢�ı��� - �Ӷ�ջ֡��ַ��ʼ��32���ֽڡ�
����λ������������Ƭ����������ÿ��������԰����ڼĴ�����һ�����л�洢��������Ƭ���޹صĴ洢��λ���С����磬 DW_OP_reg3 DW_OP_piece 4 DW_OP_reg10 DW_OP_piece 2��ǰ�ĸ��ֽ�λ�ڼĴ��� 3 �У��������ֽ�λ�ڼĴ��� 10 �е�һ��������
λ���б��������˾������������ڻ����������ڸ���λ�õĶ��󡣱��磺
<loclist with 3 entries follows>
[ 0]<lowpc=0x2e00><highpc=0x2e19>DW_OP_reg0
[ 1]<lowpc=0x2e19><highpc=0x2e3f>DW_OP_reg3
[ 2]<lowpc=0x2ec4><highpc=0x2ec7>DW_OP_reg2
���ݳ���������ĵ�ǰֵ��λ���ڼĴ���֮���ƶ��ı�����
����λ�����������࣬DW_AT_location �����ֲ�ͬ�ķ�ʽ���б��롣exprloc ����򵥺͸��ϵ�λ��������������һ���ֽڳ�����ɣ����һ�� DWARF ����ʽ��λ��������loclist �� loclistptr �ı���λ���б��������� .debug_loclists �������ṩ������ƫ�������ò���������ʵ�ʵ�λ���б���
 
DWARF ����ʽ
ʹ�� DWARF ����ʽ���������ʵ��λ�á������������ջֵ��һϵ�в������кܶ� DWARF �������ã������Ҳ�����ϸ�������ǡ��෴���һ��ÿһ������ʽ�и���һЩ���ӣ�����һ�����õĶ��������⣬��Ҫ������Щ��libelfin ��Ϊ���Ǵ���������Щ�����ԡ�
�������
DW_OP_lit0��DW_OP_lit1……DW_OP_lit31
��������ѹ���ջ
DW_OP_addr <addr>
����ַ������ѹ���ջ
DW_OP_constu <unsigned>
���޷���ֵѹ���ջ
�Ĵ���ֵ
DW_OP_fbreg <offset>
ѹ���ڶ�ջ֡��ַ�ҵ���ֵ��ƫ�Ƹ���ֵ
DW_OP_breg0��DW_OP_breg1…… DW_OP_breg31 <offset>
�������Ĵ��������ݼ��ϸ�����ƫ����ѹ���ջ
��ջ����
DW_OP_dup
���ƶ�ջ������ֵ
DW_OP_deref
����ջ������Ϊ�ڴ��ַ���������滻Ϊ�õ�ַ������
�������߼�����
DW_OP_and
������ջ����������ֵ����ѹ�����ǵ��߼� AND
DW_OP_plus
�� DW_OP_and ��ͬ�����ǻ�����ֵ
����������
DW_OP_le��DW_OP_eq��DW_OP_gt ��
����ǰ����ֵ���Ƚ����ǣ������������Ϊ�棬��ѹ�� 1������Ϊ 0
DW_OP_bra <offset>
������֧�������ջ�Ķ������� 0����ͨ�� offset �ڱ���ʽ�������������
����ת��
DW_OP_convert <DIE offset>
����ջ������ֵת��Ϊ��ͬ�����ͣ����ɸ���ƫ������ DWARF ��Ϣ��Ŀ����
�������
DW_OP_nop
ʲô��������
 
DWARF ����
DWARF ���͵ı�ʾ��Ҫ�㹻ǿ����Ϊ�������û��ṩ���õı�����ʾ���û�����ϣ���ܹ���Ӧ�ó��򼶱���е��ԣ��������ڻ���������е��ԣ�����������Ҫ�˽����ǵı���������ʲô��
DWARF ��������������������Ϣһ������� DIE �С����ǿ��Ծ���ָʾ�����ơ����롢��С���ֽڵȵ����ԡ����������ͱ�ǩ�����ڱ�ʾָ�롢���顢�ṹ�塢typedef �Լ� C �� C++ �����п��Կ������κ��������ݡ�
������򵥵Ľṹ��Ϊ����
struct test{
int i;
float j;
int k[42];
test* next;
};
����ṹ��ĸ� DIE �������ģ�
����һ��Linux���������ţ�����������
����˵����������һ������ test �Ľṹ�壬��СΪ 0xb8���� test.cpp �ĵ� 1 ��������������������������Ա���� DIE��
����һ��Linux���������ţ�����������
ÿ����Ա����һ�����ơ�һ�����ͣ�����һ�� DIE ƫ��������һ�������ļ����У��Լ�һ��ָ�����Ա���ڵĽṹ����ֽ�ƫ�ơ�������ָ�����¡�
����һ��Linux���������ţ�����������
�����������ұʼDZ������ϵ� int ��һ�� 4 �ֽڵ��з����������ͣ�float��һ�� 4 �ֽڵĸ�������������������ͨ��ָ�� int ������Ϊ��Ԫ�����ͣ�sizetype��������Ϊ�� size_t����Ϊ�������ͣ������� 2a ��Ԫ�ء� test * ������ DW_TAG_pointer_type�������� test DIE��
 
ʵ�ּ򵥵ı�����ȡ��
����������libelfin ��Ϊ���Ǵ����󲿷ָ����ԡ����ǣ�����û��ʵ�����ڱ�ʾ�ɱ�λ�õ����з��������������ǵĴ����д�����Щ����÷dz����ӡ���ˣ�������ѡ��ֻ֧�� exprloc���������Ҫ���ӶԸ������ͱ���ʽ��֧�֡��������������������ύ������ libelfin ����������ɱ�Ҫ��֧�֣�
����������Ҫ�ǽ���ͬ���ֶ�λ�ڴ洢����Ĵ����У���ȡ��д����֮ǰһ����Ϊ�˼��������ֻ����������ʵ�ֶ�ȡ��
����������Ҫ���� libelfin ��δ����ǵĽ����ж�ȡ�Ĵ��������Ǵ���һ���̳��� expr_context ���ಢʹ�� ptrace �������������ݣ�
class ptrace_expr_context : public dwarf::expr_context {
public:
ptrace_expr_context (pid_t pid) : m_pid{pid} {}
dwarf::taddr reg (unsigned regnum) override {
return get_register_value_from_dwarf_register(m_pid, regnum);
}
dwarf::taddr pc() override {
struct user_regs_struct regs;
ptrace(PTRACE_GETREGS, m_pid, nullptr, &regs);
return regs.rip;
}
dwarf::taddr deref_size (dwarf::taddr address, unsigned size) override {
//TODO take into account size
return ptrace(PTRACE_PEEKDATA, m_pid, address, nullptr);
}
private:
pid_t m_pid;
};
��ȡ�������� debugger ���е� read_variables ����������
void debugger::read_variables() {
using namespace dwarf;
auto func = get_function_from_pc(get_pc());
//...
}
�����������ĵ�һ�������ҵ�����Ŀǰ����ĺ�����Ȼ��������Ҫѭ�����ʸú����е���Ŀ��Ѱ�ұ�����
for (const auto& die : func) {
if (die.tag == DW_TAG::variable) {
//...
}
}
����ͨ������ DIE �е� DW_AT_location ��Ŀ��ȡλ����Ϣ��
auto loc_val = die[DW_AT::location];
��������ȷ������һ�� exprloc�������� libelfin ���������ǵı���ʽ��
if (loc_val.get_type() == value::type::exprloc) {
ptrace_expr_context context {m_pid};
auto result = loc_val.as_exprloc().evaluate(&context);
���������Ѿ������˱���ʽ��������Ҫ��ȡ���������ݡ����������ڴ��Ĵ����У�������ǽ����������������
switch (result.location_type) {
case expr_result::type::address:
{
auto value = read_memory(result.value);
std::cout << at_name(die) << " (0x" << std::hex << result.value << ") = "
<< value << std::endl;
break;
}
case expr_result::type::reg:
{
auto value = get_register_value_from_dwarf_register(m_pid, result.value);
std::cout << at_name(die) << " (reg " << result.value << ") = "
<< value << std::endl;
break;
}
default:
throw std::runtime_error{"Unhandled variable location"};
}
����Կ������Ҹ��ݱ��������ͣ���ӡ�����ֵ��û�н��͡�ϣ��ͨ��������룬����Կ������֧�ֱ�д�����������ø�������������������
������ǿ��Խ������ӵ����ǵ�����������У�
else if(is_prefix(command, "variables")) {
read_variables();
}
 
����һ��
��дһЩ����һЩ������С���ܣ������Ż������е�����Ϣ��������Ȼ��鿴�Ƿ���Զ�ȡ������ֵ������д��洢�������ڴ��ַ�����鿴����ı����Ϊ��
�Ѿ��о�ƪ�����ˣ���ʣ���һƪ����һ���һ�����һЩ����ܻ����Ȥ�ĸ��߼��ĸ������������� https://github.com/TartanLlama/minidbg/tree/tut_variable �ҵ�������ӵĴ��롣
 
�������ø��µ�ַ��//m.ajphoenix.com/linux/32739.html