----- Original Message -----
Hello Dave,
After some many discussions, I rewrite the code to an extension module.
What I want is not only the member of structure page, but also other
structure's members. So for the speed of analysing a big number of data
and not obeying your attitude towards the change of struct command, I
made it an extension module.
Thank you -- I do appreciate that.
I will post "pstruct.c" on the extensions web page when crash-6.0.7 is
released,
and will note the "crash-6.0.7 or later" restriction in the "comments"
section
of its entry.
And about the patch which changes gdb, I create a new method
print_command_2 to do the work.
That addition looks fine to me, and does not affect any other commands.
Queued for crash-6.0.7.
Also, I should note that I have incorporated your "ipcs" command into
crash-6.0.7. It is essentially the same as your extension module, with
these exceptions:
(1) I have re-written the "help" page
(2) I replaced your default usage of the nsproxy of the CURRENT_TASK()
with that of pid 0, because the command fails if the current
task is exiting.
(3) Similarly to the "mount" command, I have added a "-n [pid|task]"
namespace option:
For kernels supporting namespaces, the -n option may be used to
display the IPC facilities with respect to the namespace of a
specified task:
-n pid a process PID.
-n task a hexadecimal task_struct pointer.
So congratulations are in order -- it is the first new command since 2001!
Thanks,
Dave
At 2012-4-19 20:50, Dave Anderson wrote:
>
>
> ----- Original Message -----
>> At 2012-4-18 21:21, Dave Anderson wrote:
>>> In our original discussions, i thought that I had made it clear
>>> that
>>> the introduction of a new option paradigm with submembers could
>>> be
>>> avoided by using, for example, "page._mapcounter" instead of
>>> having
>>> to enter "page._mapcount.counter"? This option makes the struct
>>> command seemingly violate its own rules, and really confuses
>>> things.
>>> For example, with your patch, a user would see things like this:
>>
>> The most important reason why I insisted this option is the
>> performance.
>> Both original struct and print command are very slow. When kernel
>> debugger wants to parse a bit amount of data, the performance of
>> original struct and print command is not ideal.
>>
>>>
>>> crash> page._mapcount.counter ffffea0000000508 -s
>>> -1
>>> crash> page._mapcount.counter ffffea0000000508
>>> struct: invalid format: page._mapcount.counter
>>> crash> page._mapcount ffffea0000000508
>>> _mapcount = {
>>> counter = -1
>>> }
>>> crash> page._mapcount ffffea0000000508 -s
>>> struct: invalid data structure reference page._mapcount
>>> crash>
>>
>> An idea of solving this confusion is changing the error
>> information.
>> When users uses "-s" option and error happens, error information
>> suggests to use struct command without "-s" option if it is valid.
>> And vice versa, when error happens without specified "-s" option.
>
> It's not so much the error message wording, it's the usage of a
> completely different option-expression. And you can still display
> the -s information without the extra submember.
>
>>>
>>> I had suggested that you look into the get_member_data() function
>>> in to the gdb/symtab.c file to access the member offset and size
>>> values.
>>
>> Actually, the function need to be changed a lot to support what I
>> want.
>> I need the information of submember, and I need the position and
>> size of
>> bitfield. After investigation, function print_command_1 hides the
>> data
>> that I want. I know it is not a good idea of modifying this
>> function.
>> But what if a new function which has the similar mechanism with
>> function
>> print_command_1?
>
> Right, that's exactly what I suggested below:
>
>>> I also don't like the idea of modifying the prototype of
>>> the stalwart print_command_1() gdb function, and the creation
>>> of a new gdb command. Whenever there is a need to update the
>>> embedded gdb version, patches like this can be problematic.
>>> I would prefer that you create a new "GNU_XXXX" #define,
>>> similar to GNU_GET_SYMBOL_TYPE, pass the request through
>>> the gdb_command_funnel switch statement, and write a new
>>> standalone function to accomplish what you have done in the
>>> print_command_1() function.
>
> Dave
>
> --
> Crash-utility mailing list
> Crash-utility(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/crash-utility
>
>
--
--
Regards
Qiao Nuohan
--
Crash-utility mailing list
Crash-utility(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility