dump_stack使用方法
對於大型驅動,想要知道某個回調函數由誰調用,非常困難。到底有沒有辦法知道呢?回答是肯定的,通過內核提供的接口dump_stack()可以滿足要求。其實能夠想到使用dump_stack()來跟蹤,是根據當內核發生panic時候,也會主動調用該接口,所以我們可以在調試過程中主動調用該接口來進行測試。
TP雙擊喚醒部分驅動代碼段:
---------------------------------------------------注冊notifier到內核start-----------------------------------------------------------
#if defined(CONFIG_FB)
data->fb_notif.notifier_call = fb_notifier_callback;//回調函數在啥時候調用呢?
err = fb_register_client(&data->fb_notif);
if (err)
dev_err(&client->dev, "Unable to register fb_notifier: %d\n",
err);
#endif
---------------------------------------------------注冊notifier到內核end------------------------------------------------------------
--------------------------------------------fb_notifier_callback實現方法start----------------------------------------------------
#if defined(CONFIG_FB)
static int fb_notifier_callback(struct notifier_block *self,
unsigned long event, void *data)
{
struct fb_event *evdata = data;
int *blank;
struct ft5x06_ts_data *ft5x06_data =
container_of(self, struct ft5x06_ts_data, fb_notif);
printk(KERN_ALERT"--------------[fyl] dump_stack start----------------");
dump_stack();
printk(KERN_ALERT"--------------[fyl] dump_stack end----------------");
if (evdata && evdata->data && event == FB_EVENT_BLANK &&
ft5x06_data && ft5x06_data->client) {
blank = evdata->data;
if (*blank == FB_BLANK_UNBLANK)
ft5x06_ts_resume(&ft5x06_data->client->dev);
else if (*blank == FB_BLANK_POWERDOWN)
ft5x06_ts_suspend(&ft5x06_data->client->dev);
}
return 0;
}
#endif
--------------------------------------------fb_notifier_callback實現方法end------------------------------------------------------
測試抓取log:
<1>[ 950.351269] --------------[fyl] dump_stack start----------------
<6>[ 950.351270] CPU: 2 PID: 295 Comm: surfaceflinger Tainted: G W O 3.10.49-gc92b51d-dirty #4
<6>[ 950.351288] [<c010be4c>] (unwind_backtrace+0x0/0x11c) from [<c0109a08>] (show_stack+0x10/0x14)
<6>[ 950.351300] [<c0109a08>] (show_stack+0x10/0x14) from [<c05ca74c>] (fb_notifier_callback+0x20/0x9c)//定位到該函數
<6>[ 950.351310] [<c05ca74c>] (fb_notifier_callback+0x20/0x9c) from [<c0a7b098>] (notifier_call_chain+0x40/0x68) //nofier_call_chain調用了fb_notifier_callback
<6>[ 950.351321] [<c0a7b098>] (notifier_call_chain+0x40/0x68) from [<c01459e8>] (__blocking_notifier_call_chain+0x40/0x58)
<6>[ 950.351333] [<c01459e8>] (__blocking_notifier_call_chain+0x40/0x58) from [<c0145a14>] (blocking_notifier_call_chain+0x14/0x1c)
<6>[ 950.351344] [<c0145a14>] (blocking_notifier_call_chain+0x14/0x1c) from [<c0374ba0>] (fb_blank+0x34/0x88)
<6>[ 950.351353] [<c0374ba0>] (fb_blank+0x34/0x88) from [<c03755cc>] (do_fb_ioctl+0x51c/0x598)
<6>[ 950.351363] [<c03755cc>] (do_fb_ioctl+0x51c/0x598) from [<c021039c>] (vfs_ioctl+0x28/0x3c)
<6>[ 950.351372] [<c021039c>] (vfs_ioctl+0x28/0x3c) from [<c0210e44>] (do_vfs_ioctl+0x4d8/0x588)
<6>[ 950.351380] [<c0210e44>] (do_vfs_ioctl+0x4d8/0x588) from [<c0210f40>] (SyS_ioctl+0x4c/0x78)
<6>[ 950.351389] [<c0210f40>] (SyS_ioctl+0x4c/0x78) from [<c0105f60>] (ret_fast_syscall+0x0/0x30)
<1>[ 950.642678] --------------[fyl] dump_stack end----------------
黃色標注中從下往上表示調用順序。
總結:內核中的某些方法可以借鑒,大膽嘗試,細心驗證。
————————————————
版權聲明:本文為CSDN博主「yanlaifan」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yanlaifan/article/details/51462497