5.17
Điểm dừng
Một
phần thiết yếu của việc dò lỗi là khả năng đặt và
thao tác với những điểm dừng, mà có thể được đặt
ở bất kỳ địa chỉ nào trong không gian bộ nhớ của
tiến trình và có thể là dạng cứng hoặc mềm. Những
hàm sau đây làm việc với điểm dừng, và được định
nghĩa trong dbg.hpp.
5.17.1
get_bpt_qty
Định nghĩa
|
|
Chú giải
|
Trả về số lượng điểm dừng đang
tồn tại (bao gồm cả những điểm dừng đang hoặc
không được kích hoạt)
|
Ví dụ
|
#include <dbg.hpp>
msg("There are currently %d breakpoints
set.\n", get_bpt_qty());
|
5.17.2
getn_bpt
Định nghĩa
|
bool idaapi
getn bpt(int n, bpt t *bpt)
|
Chú giải
|
Điền vào *bpt với thông tin về điểm
dừng có vị trí n. Trả về false nếu không có điểm
dừng nào có vị trí đó.
|
Ví dụ
|
#include <dbg.hpp>
// Go through all
breakpoints, displaying the address // of where they are set.
for (int i = 0; i <
get bpt qty(); i++) { bpt t bpt;
if (getn bpt(i,
&bpt))
msg("Breakpoint
found at %a\n", bpt.ea);
}
|
5.17.3
get_bpt
Định nghĩa
|
bool idaapi
get bpt(ea t ea, bpt t *bpt)
|
Chú giải
|
Điền vào bpt thông tin về điểm dừng
được đặt tại địa chỉ ea. Nếu không có điểm
dừng nào tại địa chỉ này, giá trị false được trả
về. Nếu *bpt là NULL, hàm này đơn giản sẽ trả về
true hoặc false tùy vào điểm dừng có được đặt tại
địa chỉ ea hay không.
|
Ví dụ
|
|
5.17.4
add_bpt *
Định nghĩa
|
bool idaapi
add bpt(ea t ea, asize t size = 0, bpttype t
type = BPT SOFT)
|
Chú giải
|
Thêm một điểm dừng tại địa chỉ
ea với kiểu được xác định bởi type và kích cỡ
được xác định bởi size. Trả về false nếu nó không
thể đặt điểm dừng. Tham khảo phần 4.4.2 để được
mô tả chi tiết về những kiểu điểm dừng khác nhau.
Size không hợp lệ khi đặt một điểm dừng mềm.
|
Ví dụ
|
<dbg.hpp>
// Add a software
breakpoint at the cursor position if (add bpt(get screen ea(), 0,
BPT SOFT))
msg("Successfully set software breakpoint
at %a\n", get screen ea());
|
5.17.5
del_bpt *
Định nghĩa
|
bool idaapi del bpt(ea t ea)
|
Chú giải
|
Xóa một điểm dừng được định
nghĩa tại địa chỉ ea. Nếu không có điểm dừng nào
được định nghĩa tại đó, giá trị false được trả
về.
|
Ví dụ
|
#include <dbg.hpp>
// Go through all
breakpoints, deleting each one. for (int i = 0; i < get bpt
qty(); i++) { bpt t bpt;
if (getn bpt(i,
&bpt)) {
// Because we are performing many delete //
operations, queue the request, otherwise the // getn bpt call will
fail when the id // numbers change after the delete operation.
|
5.17.6
update_bpt
Định nghĩa
|
bool idaapi
update bpt(const bpt t *bpt)
|
Chú giải
|
Cập nhạt những thành phần có thể
sửa đổi của điểm dừng được đại diện bởi
*bpt. Trả về false nếu sửa đổi không thành công.
|
Ví dụ
|
#include <dbg.hpp>
// Loop through all
breakpoints for (int i = 0; i < get bpt qty(); i++) { bpt t
bpt;
if (getn bpt(i,
&bpt)) {
// Change the
breakpoint to not pause // execution when it's hit bpt.flags A=
BPT BRK;
// Change the
breakpoint to a trace breakpoint bpt.flags |= BPT TRACE;
// Run a little IDC
every time it's hit qstrncpy(bpt.condition,
"Message(\"Trace
hit!\")", sizeof(bpt.condition));
// Update the
breakpoint if (!update bpt(&bpt))
msg("Failed to
update breakpoint at %a\n", bpt.ea);
}
}
|
5.17.7
enable_bpt *
Định nghĩa
|
bool idaapi
enable bpt(ea t ea, bool enable = true)
|
Chú giải
|
Kích hoạt hoặc vô hiệu hóa điểm
dừng tại địa chỉ ea. Nếu không có điểm dừng nào
được định nghĩa tại địa chỉ ea, hoặc có một
lỗi xảy ra khi kích hoạt/ vô hiệu hóa điểm dừng,
giá trị false được trả về. Nếu tham số enable được
đặt thành false, điểm dừng vị vô hiệu.
|
Ví dụ
|
#include
<kernwin.hpp> // For get screen ea() definition #include
<dbg.hpp>
bpt t bpt;
// If a breakpoint
exists at the user's cursor, disable // it.
if (get bpt(get
screen ea(), &bpt)) {
if (enable bpt(get
screen ea(), false)) msg("Disabled breakpoint.\n");
}
|
5.18
Dò
Những
hàm sử dụng để dò chủ yếu tập trung vào việc kiểm
tra một kiểu dò nào đó có được kích hoạt, đang được
kích hoạt hoặc đang vị vô hiệu một kiểu dò nào đó
và lấy những sự kiện dò. Tất cả các hàm bên dưới
được định nghĩa trong dbg.hpp.
5.18.1
set_trace_size
Định nghĩa
|
bool idaapi
set trace size(int size)
|
Chú giải
|
Đặt bộ đệm dò bằng kích cỡ được
cho bởi size. Trả về false nếu có lỗi xảy ra khi cấp
phát kích cỡ này. Đặt kích cỡ bằng 0 sẽ thiết lập
một vùng đệm có kích thước vô hạn (nguy hiểm). Nếu
bạn đặt kích cỡ vùng đệm nhỏ hơn số lượng sự
kiện dò, kích cỡ của sự kiện sẽ bị xóa.
|
Ví dụ
|
#include <dbg.hpp>
// 1000 trace events
allowed if (set trace size(1000))
msg("Successfully set the trace buffer to
1000\n");
|
5.18.2
clear_trace *
Định nghĩa
|
void idaapi clear trace(void)
|
Chú giải
|
Xóa bộ đệm dò
|
Ví dụ
|
#include <dbg.hpp>
|
5.18.3
is_step_trace_enabled
Định nghĩa
|
bool idaapi
is step trace enabled(void)
|
Chú giải
|
Trả về đúng nếu dò theo bước đang
được kích hoạt.
|
Ví dụ
|
#include <dbg.hpp>
if (is step trace
enabled())
msg("Step tracing is enabled.\n");
|
5.18.4
enable_step_trace *
Định nghĩa
|
bool idaapi
enable step trace(int enable = true)
|
Chú giải
|
Kích hoạt dò theo bước. Nếu tham số
enable được đặt thành false, dò theo bước sẽ bị vô
hiệu.
|
Ví dụ
|
#include <dbg.hpp>
// Toggle step
tracing if (is step trace enabled()) enable step trace(false);
else
enable step trace();
|
5.18.5
is_insn_trace_enabled
Định nghĩa
|
bool idaapi
is insn trace enabled(void)
|
Chú giải
|
Trả về true nếu dò tho chỉ thị đang
được kích hoạt.
|
Ví dụ
|
#include <dbg.hpp>
if (is insn trace
enabled())
msg("Instruction tracing is enabled.\n");
|
5.18.6
enable_insn_trace *
Định nghĩa
|
bool idaapi
enable insn trace(int enable = true)
|
Chú giải
|
Kích hoạt dò theo chỉ thị. Nếu tham
số enable được gán bằng false, dò theo chỉ thị sẽ
bị vô hiệu.
|
Ví dụ
|
#include <dbg.hpp>
// Toggle
instruction tracing if (is insn trace enabled()) enable insn
trace(false);
else
enable insn trace();
|
5.18.7
is_func_trace_enabled
Định nghĩa
|
bool idaapi
is func trace enabled(void)
|
Chú giải
|
Trả về true nếu chức năng dò theo hàm
dược kích hoạt.
|
Ví dụ
|
#include <dbg.hpp>
if (is func trace
enabled())
msg("Function tracing is enabled.\n");
|
5.18.8
enable_func_trace
Định nghĩa
|
bool idaapi
enable func trace(int enable = true)
|
Chú giải
|
Kích hoạt chức năng dò theo hàm. Nếu
tham số enable được gán bằng false, dò theo hàm bị vô
hiệu.
|
Ví dụ
|
#include <dbg.hpp>
// Toggle function
tracing if (is func trace enabled()) enable func trace(false);
else
enable func trace();
|
5.18.9
get_tev_qty
Định nghĩa
|
int idaapi
get tev qty(void)
|
Chú giải
|
Trả về số lượng sự kiện dò đang
được lưu trong bộ đệm dò.
|
Ví dụ
|
#include <dbg.hpp>
msg("There are %d trace events in the
trace buffer.\n", get tev qty());
|
5.18.10
get_tev_info
Định nghĩa
|
bool idaapi
get tev info(int n, tev info t *tev info)
|
Chú giải
|
Trả về *tev thông tin về sự kiện dò
trong bộ đệm dò ở vị trí thứ n. Trả về false nếu
không có sự kiện dò nào ở vị trí n.
|
Ví dụ
|
#include <dbg.hpp>
// Loop through all
trace events for (int i = 0; i < get tev qty(); i++) { tev info
t tev;
// Get the trace
event information get tev info(i, &tev);
// Display the
address the event took place msg("Trace event occurred at
%a\n", tev.ea);
}
|
5.18.11
get_insn_tev_reg_val
Định nghĩa
|
bool idaapi
get insn tev reg val(int n, const char
*regname, regval t *regval)
|
Chú giải
|
Lưu giá trị của
thanh ghi *regname vào biến *regval khi chỉ thị của sự
kiện dò thứ n xảy ra, trước khi thực thi chỉ thị
này. Trả về false nếu sự kiện không phải là một
chỉ thị dò.
Lưu giá trị của thanh ghi *regname vào
biến *regval khi chỉ thị dò
|
Ví dụ
|
#include <dbg.hpp>
// Loop through all
trace events for (int i = 0; i < get tev qty(); i++) { regval t
esp; tev info t tev;
// Get the trace
event information get tev info(i, &tev);
// If it's an
instruction trace event... if (tev.type == tev insn) {
// Get ESP, store
into &esp
if (get insn tev reg
val(i, "ESP", &esp))
// Display the value
of ESP
msg("TEV #%d
before exec: %a\n", i, esp.ival);
else
msg("No ESP
change for TEV #%d\n", i);
}
}
|
5.18.12
get_insn_tev_reg_result
Định nghĩa
|
bool idaapi
get insn tev reg result(int n, const char
*regname, regval t *regval)
|
Chú giải
|
Lưu giá trị của thanh ghi *regname vào
biến *regval khi chỉ thị dò thứ n xảy ra, sau khi thực
thi chỉ thị này. Trả về false nếu thanh ghi không bị
thay đổi hoặc n không phải là một chỉ thị dò.
|
Ví dụ
|
#include <dbg.hpp>
|
5.18.13
get_call_tev_callee
Định nghĩa
|
ea t idaapi
get call tev callee(int n)
|
Chú giải
|
Trả về địa chỉ của hàm được gọi
cho hàm sự kiện dò thứ n. Trả về BADADDR nếu không
có hàm dò nào thứ n. Kiểu của hàm sự kiện dò phải
là tev_call.
|
Ví dụ
|
#include <dbg.hpp>
// Loop through all
trace events for (int i = o; i < get tev qty(); i++) { regval_t
esp; tev info t tev;
// Get the trace
event information get tev info(i, &tev);
// If it's an
function call trace event... if (tev.type == tev call) { ea t
addr;
// Get ESP, store
into &esp
if ((addr = get call
tev callee(i)) != BADADDR) msg("Function at %a was called\n",
addr);
}
}
|
5.18.14
Định nghĩa
|
ea t idaapi
get ret tev return(int n)
|
Chú giải
|
Trả về địa chỉ của hàm gọi đến
hàm dò sự kiện thứ n. Trả về BADADDR nếu không có
hàm dò sự kiện thứ n nào. Kiểu của hàm sự kiện
dò phải là tev_ret
|
Ví dụ
|
#include <dbg.hpp>
// Loop through all
trace events for (int i = 0; i < get tev qty(); i++) { tev info
t tev;
// Get the trace
event information get tev info(i, &tev);
// If it's an
function return trace event... if (tev.type == tev ret) { ea t
addr;
if ((addr = get ret
tev return(i)) != BADADDR) msg("Function returned to %a\n",
addr);
}
}
|
5.18.15
Định nghĩa
|
ea t idaapi
get bpt tev ea(int n)
|
Chú giải
|
Trả về địa chỉ của sự kiện dò
thứ n có kiểu đọc/ghi/thực thi. Trả về false nếu
không có sự kiện dò nào thuộc loại đọc/ghi/thực
thi.
|
Ví dụ
|
#include <dbg.hpp>
// Loop through all
trace events for (int i = 0; i < get tev qty(); i++) { tev info
t tev;
// Get the trace
event information get tev info(i, &tev);
// If it's an
breakpoint trace event... if (tev.type == tev bpt) { ea t addr;
if ((addr = get bpt
tev ea(i)) != BADADDR)
msg("Breakpoint
trace hit at %a\n", addr);
}
}
|
No comments:
Post a Comment