Re: [Crash-utility] [PATCH 0/5] crash: Bundle of fixes for Xen
by Daniel Kiper
Hi Dave,
> > > Here is next bundle of fixes for crash Xen support:
> > > - xen: Fix page tables caching issues,
> > > - xen: Use init_tss array or per_cpu__init_tss,
> > > - xen: Use per_cpu__crash_notes or crash_notes array,
> > > - xen: Try hard to get max_cpus value,
> > > - xen: Use cpu_present_map instead of cpu_online_map.
> > >
> > > All patches were tested with Xen versions up to 4.2.
> > >
> > > Daniel
> > >
> >
> > Hi Daniel,
> >
> > The patches look reasonable to me, and they test OK on older
> > RHEL5 dom0 dumpfiles. It would be interesting to see whether
> > they work for Hu Jun's SUSE kernel dumpfile. I've cc'd him
> > directly.
>
> And BTW, queued for crash-6.1.1.
Thanks.
Daniel
12 years
[PATCH 0/5] crash: Bundle of fixes for Xen
by Daniel Kiper
Hi,
Here is next bundle of fixes for crash Xen support:
- xen: Fix page tables caching issues,
- xen: Use init_tss array or per_cpu__init_tss,
- xen: Use per_cpu__crash_notes or crash_notes array,
- xen: Try hard to get max_cpus value,
- xen: Use cpu_present_map instead of cpu_online_map.
All patches were tested with Xen versions up to 4.2.
Daniel
12 years
[PATCH] runq: make tasks in throttled cfs_rqs/rt_rqs displayed
by Zhang Yanfei
Hello Dave,
Currently, runq command doesn't show tasks in throttled cfs_rqs/rt_rqs,
but sometimes we want to display them to help us find the problem. So
I made the patches to make them displayed.
Two patches are attached. and PATCH2 should be applied after PATCH1.
PATCH1: 0001-runq-make-tasks-in-cfs_rq-displayed-hierarchically.patch
this patch is used to change the original display of the cfs_rq tasks.
for example, before applying PATCH1, the display is:
CPU 2 RUNQUEUE: ffff88002c316680
CURRENT: PID: 4274 TASK: ffff88013aa2eae0 COMMAND: "sh"
RT PRIO_ARRAY: ffff88002c316808
[no tasks queued]
CFS RB_ROOT: ffff88002c316718
[120] PID: 4296 TASK: ffff88010916d540 COMMAND: "sh"
[120] PID: 4258 TASK: ffff880135c5eaa0 COMMAND: "sh"
[120] PID: 4270 TASK: ffff88013aeb6aa0 COMMAND: "sh"
[120] PID: 4268 TASK: ffff88013b6b4040 COMMAND: "sh"
[120] PID: 4272 TASK: ffff88013a918080 COMMAND: "sh"
[120] PID: 4280 TASK: ffff880109028080 COMMAND: "sh"
[120] PID: 4276 TASK: ffff8801388fa080 COMMAND: "sh"
[120] PID: 4278 TASK: ffff880109029540 COMMAND: "sh"
[120] PID: 4260 TASK: ffff88013aeeeae0 COMMAND: "sh"
[130] PID: 4335 TASK: ffff88011ac3d500 COMMAND: "sosreport"
[120] PID: 4284 TASK: ffff8801050a7540 COMMAND: "sh"
[120] PID: 4286 TASK: ffff8801050a6080 COMMAND: "sh"
[120] PID: 4282 TASK: ffff88011ac48aa0 COMMAND: "sh"
[120] PID: 4290 TASK: ffff8801041f7540 COMMAND: "sh"
[120] PID: 4288 TASK: ffff880121530aa0 COMMAND: "sh"
[120] PID: 4292 TASK: ffff8801041f6080 COMMAND: "sh"
[120] PID: 4262 TASK: ffff880137b21500 COMMAND: "sh"
[120] PID: 4266 TASK: ffff88011aeb4aa0 COMMAND: "sh"
[120] PID: 4264 TASK: ffff88010400b540 COMMAND: "sh"
after applying PATCH1, the display is changed to:
CPU 2 RUNQUEUE: ffff88002c316680
CURRENT: PID: 4274 TASK: ffff88013aa2eae0 COMMAND: "sh"
RT PRIO_ARRAY: ffff88002c316808
[no tasks queued]
CFS RB_ROOT: ffff88002c316718
[120] PID: 4296 TASK: ffff88010916d540 COMMAND: "sh"
[120] PID: 4258 TASK: ffff880135c5eaa0 COMMAND: "sh"
GROUP CFS RB_ROOT: ffff880138f50200 <test1>
GROUP CFS RB_ROOT: ffff88001f8d1e00 <test11>
[120] PID: 4270 TASK: ffff88013aeb6aa0 COMMAND: "sh"
[120] PID: 4268 TASK: ffff88013b6b4040 COMMAND: "sh"
[120] PID: 4272 TASK: ffff88013a918080 COMMAND: "sh"
GROUP CFS RB_ROOT: ffff88013a1ba200 <test12>
[120] PID: 4280 TASK: ffff880109028080 COMMAND: "sh"
[120] PID: 4276 TASK: ffff8801388fa080 COMMAND: "sh"
[120] PID: 4278 TASK: ffff880109029540 COMMAND: "sh"
[120] PID: 4260 TASK: ffff88013aeeeae0 COMMAND: "sh"
[130] PID: 4335 TASK: ffff88011ac3d500 COMMAND: "sosreport"
GROUP CFS RB_ROOT: ffff88013bb75400 <test2>
GROUP CFS RB_ROOT: ffff8801381f1000 <test21>
[120] PID: 4284 TASK: ffff8801050a7540 COMMAND: "sh"
[120] PID: 4286 TASK: ffff8801050a6080 COMMAND: "sh"
[120] PID: 4282 TASK: ffff88011ac48aa0 COMMAND: "sh"
GROUP CFS RB_ROOT: ffff88001f816000 <test22>
[120] PID: 4290 TASK: ffff8801041f7540 COMMAND: "sh"
[120] PID: 4288 TASK: ffff880121530aa0 COMMAND: "sh"
[120] PID: 4292 TASK: ffff8801041f6080 COMMAND: "sh"
[120] PID: 4262 TASK: ffff880137b21500 COMMAND: "sh"
[120] PID: 4266 TASK: ffff88011aeb4aa0 COMMAND: "sh"
[120] PID: 4264 TASK: ffff88010400b540 COMMAND: "sh"
PACTH2: 0002-runq-make-tasks-in-throttled-cfs_rqs-rt_rqs-displaye.patch
this patch is used to display tasks in throttled cfs_rqs and rt_rqs.
for example, before applying PATCH2:
CPU 1 RUNQUEUE: ffff88002c296680
CURRENT: PID: 3494 TASK: ffff88011bcaa080 COMMAND: "sh"
RT PRIO_ARRAY: ffff88002c296808
[no tasks queued]
CFS RB_ROOT: ffff88002c296718
[120] PID: 3516 TASK: ffff88011bfdd500 COMMAND: "sh"
[120] PID: 3514 TASK: ffff88011bef2ae0 COMMAND: "sh"
after applying PATCH2:
CPU 1 RUNQUEUE: ffff88002c296680
CURRENT: PID: 3494 TASK: ffff88011bcaa080 COMMAND: "sh"
RT PRIO_ARRAY: ffff88002c296808
[ 0] GROUP RT PRIO_ARRAY: ffff88013b351800 <test1> (THROTTLED)
[ 0] GROUP RT PRIO_ARRAY: ffff88013acdb800 <test11>
[ 0] PID: 3546 TASK: ffff88010d05e040 COMMAND: "rtloop99"
[ 1] PID: 3541 TASK: ffff88011bef2080 COMMAND: "rtloop98"
[ 54] PID: 3536 TASK: ffff88011bf28080 COMMAND: "rtloop45"
[ 98] PID: 3530 TASK: ffff88013ab1aaa0 COMMAND: "rtloop1"
[ 1] PID: 3540 TASK: ffff88011bf29540 COMMAND: "rtloop98"
[ 54] PID: 3534 TASK: ffff88013ab14040 COMMAND: "rtloop45"
[ 54] GROUP RT PRIO_ARRAY: ffff88013a207800 <test12>
[ 54] PID: 3537 TASK: ffff88013a378ae0 COMMAND: "rtloop45"
[ 98] PID: 3531 TASK: ffff88011bdae080 COMMAND: "rtloop1"
CFS RB_ROOT: ffff88002c296718
[120] PID: 3516 TASK: ffff88011bfdd500 COMMAND: "sh"
[120] PID: 3514 TASK: ffff88011bef2ae0 COMMAND: "sh"
Another example to show the throttled tasks in cfs_rqs:
CPU 1 RUNQUEUE: ffff880028296680
CURRENT: PID: 7814 TASK: ffff880117bab500 COMMAND: "sh"
RT PRIO_ARRAY: ffff880028296808
[no tasks queued]
CFS RB_ROOT: ffff880028296718
[120] PID: 2619 TASK: ffff88013812c040 COMMAND: "Xorg"
......
[120] PID: 7798 TASK: ffff88013a39eae0 COMMAND: "sh"
GROUP CFS RB_ROOT: ffff880135fc6800 <test1> (DEQUEUED)
GROUP CFS RB_ROOT: ffff88000ce5bc00 <test12> (THROTTLED)
[120] PID: 7820 TASK: ffff8801383ab500 COMMAND: "sh"
[120] PID: 7818 TASK: ffff88013ba14ae0 COMMAND: "sh"
[120] PID: 7816 TASK: ffff880117baa040 COMMAND: "sh"
GROUP CFS RB_ROOT: ffff880135fc6800 <test1> (DEQUEUED)
GROUP CFS RB_ROOT: ffff8800b0b32000 <test11> (THROTTLED)
[120] PID: 7810 TASK: ffff8800b0b96aa0 COMMAND: "sh"
*NOTE*
1. The patch also displays the group name that the cfs_rq/rt_rq belows to.
2. There are two statuses about the rqs: DEQUEUED and THROTTLED.
THROTTLED means this cfs_rq/rt_rq is throttled. And DEQUEUED means the
running entities in the rq are 0 because no running task on it and its
child rqs are throttled.
Thanks
Zhang Yanfei
12 years
[PATCH 5/5] xen: Use cpu_present_map instead of cpu_online_map
by Daniel Kiper
Newer Xen versions (at least 4.2) clear cpu_online_map during crash.
In this case it is not possible to check which CPUs were available.
cpu_present_map contains such information but it has different meaning.
However, we do not have a choice and we must use cpu_present_map instead
of cpu_online_map.
Signed-off-by: Daniel Kiper <daniel.kiper(a)oracle.com>
diff -Npru crash-6.1.0.orig/xen_hyper.c crash-6.1.0/xen_hyper.c
--- crash-6.1.0.orig/xen_hyper.c 2012-11-13 15:08:41.000000000 +0100
+++ crash-6.1.0/xen_hyper.c 2012-11-13 15:09:03.000000000 +0100
@@ -1912,11 +1912,10 @@ xen_hyper_get_cpu_info(void)
if((xht->cpumask = malloc(XEN_HYPER_SIZE(cpumask_t))) == NULL) {
error(FATAL, "cannot malloc cpumask space.\n");
}
- /* kakuma: It may be better to use cpu_present_map. */
- addr = symbol_value("cpu_online_map");
+ addr = symbol_value("cpu_present_map");
if (!readmem(addr, KVADDR, xht->cpumask,
- XEN_HYPER_SIZE(cpumask_t), "cpu_online_map", RETURN_ON_ERROR)) {
- error(FATAL, "cannot read cpu_online_map.\n");
+ XEN_HYPER_SIZE(cpumask_t), "cpu_present_map", RETURN_ON_ERROR)) {
+ error(FATAL, "cannot read cpu_present_map.\n");
}
if (xht->cpu_idxs) {
free(xht->cpu_idxs);
12 years
[PATCH 4/5] xen: Try hard to get max_cpus value
by Daniel Kiper
This patch improves max_cpus value calculation. First
xen_hyper_get_cpu_info() tries to get it from nr_cpu_ids
variable. If nr_cpu_ids does not exist then it attempts
to read max_cpus variable. If it is not available estimate
max_cpus value on the base of cpumask_t size.
Signed-off-by: Daniel Kiper <daniel.kiper(a)oracle.com>
diff -Npru crash-6.1.0.orig/xen_hyper.c crash-6.1.0/xen_hyper.c
--- crash-6.1.0.orig/xen_hyper.c 2012-11-13 15:02:34.000000000 +0100
+++ crash-6.1.0/xen_hyper.c 2012-11-13 15:07:40.000000000 +0100
@@ -1883,13 +1883,28 @@ xen_hyper_get_uptime_hyper(void)
void
xen_hyper_get_cpu_info(void)
{
- ulong addr;
+ ulong addr, init_begin, init_end;
ulong *cpumask;
uint *cpu_idx;
int i, j, cpus;
XEN_HYPER_STRUCT_SIZE_INIT(cpumask_t, "cpumask_t");
- xht->max_cpus = XEN_HYPER_SIZE(cpumask_t) * 8;
+
+ if (symbol_exists("nr_cpu_ids"))
+ get_symbol_data("nr_cpu_ids", sizeof(uint), &xht->max_cpus);
+ else {
+ init_begin = symbol_value("__init_begin");
+ init_end = symbol_value("__init_end");
+ addr = symbol_value("max_cpus");
+
+ if (addr >= init_begin && addr < init_end)
+ xht->max_cpus = XEN_HYPER_SIZE(cpumask_t) * 8;
+ else {
+ get_symbol_data("max_cpus", sizeof(xht->max_cpus), &xht->max_cpus);
+ if (XEN_HYPER_SIZE(cpumask_t) * 8 > xht->max_cpus)
+ xht->max_cpus = XEN_HYPER_SIZE(cpumask_t) * 8;
+ }
+ }
if (xht->cpumask) {
free(xht->cpumask);
12 years
[PATCH 3/5] xen: Use per_cpu__crash_notes or crash_notes array
by Daniel Kiper
Newer Xen versions (at least 4.2) use crash_notes array
instead of per_cpu__crash_notes. Take into account that.
Signed-off-by: Daniel Kiper <daniel.kiper(a)oracle.com>
diff -Npru crash-6.1.0.orig/xen_hyper.c crash-6.1.0/xen_hyper.c
--- crash-6.1.0.orig/xen_hyper.c 2012-09-27 21:19:15.000000000 +0200
+++ crash-6.1.0/xen_hyper.c 2012-11-12 15:56:17.000000000 +0100
@@ -645,15 +645,22 @@ xen_hyper_dumpinfo_init(void)
error(FATAL, "cannot malloc dumpinfo table context_xen_core_array space.\n");
}
BZERO(xhdit->context_xen_core_array, size);
- addr = symbol_value("per_cpu__crash_notes");
+ if (symbol_exists("per_cpu__crash_notes"))
+ addr = symbol_value("per_cpu__crash_notes");
+ else
+ get_symbol_data("crash_notes", sizeof(ulong), &addr);
for (i = 0; i < machdep->get_smp_cpus(); i++) {
ulong addr_notes;
- addr_notes = xen_hyper_per_cpu(addr, i);
+ if (symbol_exists("per_cpu__crash_notes"))
+ addr_notes = xen_hyper_per_cpu(addr, i);
+ else
+ addr_notes = addr + i * STRUCT_SIZE("crash_note_range_t") +
+ MEMBER_OFFSET("crash_note_range_t", "start");
if (xhdit->note_ver == XEN_HYPER_ELF_NOTE_V4) {
if (!readmem(addr_notes, KVADDR, &(xhdit->context_array[i].note),
- sizeof(ulong), "per_cpu__crash_notes", RETURN_ON_ERROR)) {
- error(WARNING, "cannot read per_cpu__crash_notes.\n");
+ sizeof(ulong), "crash_notes", RETURN_ON_ERROR)) {
+ error(WARNING, "cannot read crash_notes.\n");
return;
}
} else {
@@ -678,7 +685,7 @@ xen_hyper_dumpinfo_init(void)
xhdit->xen_info_cpu = samp_cpuid;
if (!xen_hyper_fill_elf_notes(xhdit->context_array[samp_cpuid].note,
buf, XEN_HYPER_ELF_NOTE_FILL_T_NOTE)) {
- error(FATAL, "cannot read per_cpu__crash_notes.\n");
+ error(FATAL, "cannot read crash_notes.\n");
}
bp = buf;
12 years
[PATCH 2/5] xen: Use init_tss array or per_cpu__init_tss
by Daniel Kiper
Newer Xen versions (at least 4.2) use per_cpu__init_tss
instead of init_tss array. Take into account that.
Signed-off-by: Daniel Kiper <daniel.kiper(a)oracle.com>
diff -Npru crash-6.1.0.orig/x86.c crash-6.1.0/x86.c
--- crash-6.1.0.orig/x86.c 2012-11-13 14:45:58.000000000 +0100
+++ crash-6.1.0/x86.c 2012-11-13 14:48:13.000000000 +0100
@@ -5471,9 +5471,16 @@ x86_get_stackbase_hyper(ulong task)
if (!xen_hyper_test_pcpu_id(pcpu)) {
error(FATAL, "invalid pcpu number\n");
}
- init_tss = symbol_value("init_tss");
+
+ if (symbol_exists("init_tss")) {
+ init_tss = symbol_value("init_tss");
+ init_tss += XEN_HYPER_SIZE(tss_struct) * pcpu;
+ } else {
+ init_tss = symbol_value("per_cpu__init_tss");
+ init_tss = xen_hyper_per_cpu(init_tss, pcpu);
+ }
+
buf = GETBUF(XEN_HYPER_SIZE(tss_struct));
- init_tss += XEN_HYPER_SIZE(tss_struct) * pcpu;
if (!readmem(init_tss, KVADDR, buf,
XEN_HYPER_SIZE(tss_struct), "init_tss", RETURN_ON_ERROR)) {
error(FATAL, "cannot read init_tss.\n");
12 years
[PATCH 1/5] xen: Fix page tables caching issues
by Daniel Kiper
Xen specific functions reading page tables utilize a form
of cache to speed up reading process. However, some of them
do not properly update info about cached data. In specific
cases it leads to the situation in which functions attempting
to use cached data in real read freshly loaded garbage. This
patch fixes this issue by adding relevant updates
for cached info data.
Linux Kernel commit 250a41e0ecc433cdd553a364d0fc74c766425209
(xen/p2m: Reuse existing P2M leafs if they are filled
with 1:1 PFNs or INVALID) helped to discover this issue.
Signed-off-by: Daniel Kiper <daniel.kiper(a)oracle.com>
diff -Npru crash-6.1.0.orig/x86.c crash-6.1.0/x86.c
--- crash-6.1.0.orig/x86.c 2012-09-27 21:19:15.000000000 +0200
+++ crash-6.1.0/x86.c 2012-11-12 15:29:45.000000000 +0100
@@ -4684,6 +4684,7 @@ use_cr3:
machdep->last_ptbl_read = BADADDR;
machdep->last_pmd_read = BADADDR;
+ machdep->last_pgd_read = BADADDR;
for (i = 0; i < xkd->p2m_frames; i++) {
xkd->p2m_mfn_frame_list[i] = x86_xen_kdump_page_mfn(kvaddr);
@@ -4698,6 +4699,7 @@ use_cr3:
machdep->last_ptbl_read = 0;
machdep->last_pmd_read = 0;
+ machdep->last_pgd_read = 0;
pc->readmem = read_kdump;
if (CRASHDEBUG(1))
fprintf(fp, "readmem (restore): read_kdump()\n");
@@ -4910,6 +4912,8 @@ x86_xendump_p2m_create(struct xendump_da
if (!xc_core_mfn_to_page(mfn, machdep->pgd))
error(FATAL, "cannot read/find cr3 page\n");
+ machdep->last_pgd_read = mfn;
+
if (CRASHDEBUG(1)) {
fprintf(xd->ofp, "contents of page directory page:\n");
@@ -5008,6 +5012,8 @@ x86_pvops_xendump_p2m_create(struct xend
if (!xc_core_mfn_to_page(mfn, machdep->pgd))
error(FATAL, "cannot read/find cr3 page\n");
+ machdep->last_pgd_read = mfn;
+
if (CRASHDEBUG(1)) {
fprintf(xd->ofp, "contents of page directory page:\n");
diff -Npru crash-6.1.0.orig/x86_64.c crash-6.1.0/x86_64.c
--- crash-6.1.0.orig/x86_64.c 2012-09-27 21:19:15.000000000 +0200
+++ crash-6.1.0/x86_64.c 2012-11-09 14:41:29.000000000 +0100
@@ -5653,6 +5653,8 @@ x86_64_xen_kdump_load_page(ulong kvaddr,
if (!readmem(PTOB(mfn), PHYSADDR, machdep->pgd, PAGESIZE(),
"xen kdump pud page", RETURN_ON_ERROR))
error(FATAL, "cannot read/find pud page\n");
+
+ machdep->last_pgd_read = mfn;
if (CRASHDEBUG(7))
x86_64_debug_dump_page(fp, machdep->pgd,
@@ -5670,6 +5672,8 @@ x86_64_xen_kdump_load_page(ulong kvaddr,
"xen kdump pmd page", RETURN_ON_ERROR))
error(FATAL, "cannot read/find pmd page\n");
+ machdep->last_pmd_read = mfn;
+
if (CRASHDEBUG(7))
x86_64_debug_dump_page(fp, machdep->pmd,
"contents of page middle directory page:");
@@ -5686,6 +5690,8 @@ x86_64_xen_kdump_load_page(ulong kvaddr,
"xen kdump page table page", RETURN_ON_ERROR))
error(FATAL, "cannot read/find page table page\n");
+ machdep->last_ptbl_read = mfn;
+
if (CRASHDEBUG(7))
x86_64_debug_dump_page(fp, machdep->ptbl,
"contents of page table page:");
@@ -6304,6 +6310,8 @@ x86_64_xendump_load_page(ulong kvaddr, s
if (!xc_core_mfn_to_page(mfn, machdep->pgd))
error(FATAL, "cannot read/find pud page\n");
+ machdep->last_pgd_read = mfn;
+
if (CRASHDEBUG(7))
x86_64_debug_dump_page(xd->ofp, machdep->pgd,
"contents of page upper directory page:");
@@ -6319,6 +6327,8 @@ x86_64_xendump_load_page(ulong kvaddr, s
if (!xc_core_mfn_to_page(mfn, machdep->pmd))
error(FATAL, "cannot read/find pmd page\n");
+ machdep->last_pmd_read = mfn;
+
if (CRASHDEBUG(7))
x86_64_debug_dump_page(xd->ofp, machdep->pmd,
"contents of page middle directory page:");
@@ -6334,6 +6344,8 @@ x86_64_xendump_load_page(ulong kvaddr, s
if (!xc_core_mfn_to_page(mfn, machdep->ptbl))
error(FATAL, "cannot read/find page table page\n");
+ machdep->last_ptbl_read = mfn;
+
if (CRASHDEBUG(7))
x86_64_debug_dump_page(xd->ofp, machdep->ptbl,
"contents of page table page:");
12 years
[Crash] [PATCH] add a new command: lscgroup
by 俞永明
Hello Dave,
I have been working on a new command named lscgroup to
list cgroups' information and finished it recently.
This command displays all the cgroups' information or the
appointed cgroups' information relatively according to user's
input. The following shows the two types of output.
1.Display all the cgroups' information of the system.
crash>lscgroup
blkio:/
blkio:/libvirt
blkio:/libvirt/lxc
blkio:/libvirt/qemu
net_cls:/
...
...
cpuset:/
cpuset:/libvirt
cpuset:/libvirt/lxc
cpuset:/libvirt/qemu
2.Display the appointed cgroups' information.
crash> lscgroup memory:/ cpuset:/libvirt
memory:/
memory:/libvirt
memory:/libvirt/lxc
memory:/libvirt/qemu
cpuset:/libvirt
cpuset:/libvirt/lxc
cpuset:/libvirt/qemu
To see more details, please refer to the help information and the patch.
To build the module from the top-level crash-<version> directory, enter:
$ cp <path-to>/lscgroup.c extensions
$ make extensions
12 years
gdb update for crash?
by Lei Wen
Hi Dave,
Do you have any plan to update the gdb inside of crash, like updating to 7.5?
While I try to do it by myself, I met link error as below, any idea?
While I check the compiled code when the error happen, I find the gdb_interface.c not be compiled yet, so should it be compiled first before gdb?
symtab.o:symtab.c:function gdb_get_datatype: error: undefined reference to 'gdb_CRASHDEBUG'
symtab.o:symtab.c:function gdb_get_datatype: error: undefined reference to 'console'
symtab.o:symtab.c:function gdb_get_datatype: error: undefined reference to 'gdb_CRASHDEBUG'
symtab.o:symtab.c:function gdb_get_datatype: error: undefined reference to 'console'
symtab.o:symtab.c:function gdb_get_datatype: error: undefined reference to 'gdb_CRASHDEBUG'
symtab.o:symtab.c:function gdb_get_datatype: error: undefined reference to 'console'
symtab.o:symtab.c:function gdb_add_symbol_file: error: undefined reference to 'same_file'
symtab.o:symtab.c:function gdb_delete_symbol_file: error: undefined reference to 'same_file'
symtab.o:symtab.c:function gdb_patch_symbol_values: error: undefined reference to 'patch_kernel_symbol'
symtab.o:symtab.c:function gdb_patch_symbol_values: error: undefined reference to 'patch_kernel_symbol'
symtab.o:symtab.c:function gdb_patch_symbol_values: error: undefined reference to 'patch_kernel_symbol'
psymtab.o:psymtab.c:function find_pc_sect_psymtab: error: undefined reference to 'gdb_line_number_callback'
symfile.o:symfile.c:function find_separate_debug_file: error: undefined reference to 'check_specified_module_tree'
symfile.o:symfile.c:function find_separate_debug_file_by_debuglink: error: undefined reference to 'check_specified_kernel_debug_file'
main.o:main.c:function captured_main: error: undefined reference to 'update_gdb_hooks'
target.o:target.c:function target_read_memory: error: undefined reference to 'gdb_readmem_callback'
target.o:target.c:function target_read_stack: error: undefined reference to 'gdb_readmem_callback'
target.o:target.c:function target_write_memory: error: undefined reference to 'gdb_readmem_callback'
Thanks,
Lei
12 years