Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Python: Bugs

[issue14776] Add SystemTap static markers

 

 

Python bugs RSS feed   Index | Next | Previous | View Threaded


report at bugs

May 10, 2012, 2:05 PM

Post #1 of 23 (337 views)
Permalink
[issue14776] Add SystemTap static markers

New submission from Dave Malcolm <dmalcolm [at] redhat>:

I'm attaching a patch which adds static markers for SystemTap for two probeable events within CPython's bytecode interpreter, along with test cases and documentation.

I'm hoping to get this merged for 3.3; is this PEP-worthy, or can this be done through patch review?

Note: issue #4111 was originally opened on 2008-10-12 as "Add DTrace probes", and was generalized on 2009-12-08 to "Add Systemtap/DTrace probes". That issue was closed on 2011-11-14 to be superceded by issue #13405 ("Add DTrace probes"), hence I'm opening this as a separate issue.

I believe that although DTrace and SystemTap are similar, they are sufficiently different from each other that it's going to take separate work to support one or the other (and that the maintainers of the support for each within CPython are likely to be different people). I hope that once one of them is merged, the other will become a lot easier to merge.

Potentially other markers could be added for other events (the DTrace patch in issue #13405 has gained some), but I wanted to start small for now.

----------
components: Interpreter Core
files: cpython-systemtap-2012-05-10-001.patch
keywords: needs review, patch
messages: 160374
nosy: dmalcolm
priority: normal
severity: normal
stage: patch review
status: open
title: Add SystemTap static markers
type: enhancement
versions: Python 3.3
Added file: http://bugs.python.org/file25529/cpython-systemtap-2012-05-10-001.patch

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 10, 2012, 4:49 PM

Post #2 of 23 (308 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Éric Araujo <merwok [at] netwok> added the comment:

I think the doc may be more at home in the Developer’s Guide (like the doc about GDB) rather that the new-user-oriented “Setup and Usage” doc.

----------
nosy: +eric.araujo

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 10, 2012, 4:51 PM

Post #3 of 23 (309 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Éric Araujo <merwok [at] netwok> added the comment:

BTW if you don’t get feedback in a week or two you could go to python-dev; if there is no controversy nor implications on third-party code this will likely not require a PEP, only agreement between the core devs. Good luck!

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 10, 2012, 9:53 PM

Post #4 of 23 (313 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Antoine Pitrou <pitrou [at] free> added the comment:

Well, at least it looks much cleaner that the dtrace patch.

Two comments still:
- is pysystemtap.h meant to be a public header? otherwise it should perhaps not end up in Include (I'm not sure what our policy is here)
- perhaps get_frame_marker_info() and friends could still be a in separate ceval-systemtap.h file? that way the only added complication in ceval.c would be a couple of includes, and the two `if`s in the eval loop

----------
nosy: +jcea, loewis, pitrou

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 11, 2012, 7:55 AM

Post #5 of 23 (310 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Changes by Mark Wielaard <mjw [at] redhat>:


----------
nosy: +mjw

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 11, 2012, 8:02 AM

Post #6 of 23 (319 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Mark Wielaard <mjw [at] redhat> added the comment:

Just a comment that newer [eu]-readelf -n will provide a nicer view of the sdt ELF notes. You might want to suggest that in the documentation.

e.g. $ eu-readelf -n /usr/lib64/libpython2.7.so

Note section [ 1] '.note.gnu.build-id' of 36 bytes at offset 0x190:
Owner Data size Type
GNU 20 GNU_BUILD_ID
Build ID: a28f8db1b224530b0d38ad7b82a249cf7c3f18d6

Note section [27] '.note.stapsdt' of 184 bytes at offset 0x1ae884:
Owner Data size Type
stapsdt 70 Version: 3
PC: 0xe0d3a, Base: 0x14b150, Semaphore: 0x3ae882
Provider: python, Name: function__return, Args: '8@%rbx 8@%r13 -4@%eax'
stapsdt 69 Version: 3
PC: 0xe0f37, Base: 0x14b150, Semaphore: 0x3ae880
Provider: python, Name: function__entry, Args: '8@%rbx 8@%r13 -4@%eax'

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 11, 2012, 1:49 PM

Post #7 of 23 (313 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Dave Malcolm <dmalcolm [at] redhat> added the comment:

Thanks Eric, Antoine and Mark.

I'm attaching two new patches: a replacement patch for cpython, and a new patch for the devguide

I've moved the docs to the dev guide, starting a new "Debugging and Instrumentation" section there.

Changes to the cpython patch:
* fixed a bug in configure.in that was enabling systemtap support even without --with-systemtap (if the devel toolchain was present)
* I added an initial check to test_systemtap to skip the tests unless Python was configured --with-systemtap
* pysystemtap.h is not meant to be public, so I've moved the source pysystemtap.d and generated header pysystemtap.h from Include/ to Python/. I also simplified pysystemtap.d (removed the #pragma lines, since I believe they're DTrace-specific).
* I've introduced a Python/ceval_systemtap.h private header as suggested by Antoine, moving things in there to simplify the changes to Python/ceval.c

Changes to the devguide docs:
* removed the ".. impl-detail" as this only seems to work (and be appropriate) in the cpython Doc build, not in devguide.
* added "eu-readelf -n" example from Mark

The docs refer to the low-level way of doing things (using the markers directly), but don't yet spell out the higher-level way (creating a tapset). I've left this out of the patches for now to keep the patches simpler.

----------
Added file: http://bugs.python.org/file25539/cpython-systemtap-2012-05-11-001.patch

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 11, 2012, 1:50 PM

Post #8 of 23 (314 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Changes by Dave Malcolm <dmalcolm [at] redhat>:


Added file: http://bugs.python.org/file25540/devguide-systemtap-2012-05-11-001.patch

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 13, 2012, 10:58 PM

Post #9 of 23 (298 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Changes by Bohuslav "Slavek" Kabrda <bkabrda [at] redhat>:


----------
nosy: +bkabrda

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 9:22 AM

Post #10 of 23 (295 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Changes by Dave Malcolm <dmalcolm [at] redhat>:


----------
nosy: +fche, scox

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 9:41 AM

Post #11 of 23 (300 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Antoine Pitrou <pitrou [at] free> added the comment:

I tried the patch under Mageia 1 and got the following failure:

test_systemtap skipped -- Test systemtap script did not run; stderr was: b"Pass 1: parsed user script and 72 library script(s) using 56252virt/20964res/1828shr kb, in 70usr/0sys/82real ms.\nPass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) using 56648virt/21492res/1900shr kb, in 10usr/0sys/3real ms.\nPass 3: using cached /home/antoine/.systemtap/cache/15/stap_155c3565481f113c929ad94e10c2b48e_779.c\nPass 4: using cached /home/antoine/.systemtap/cache/15/stap_155c3565481f113c929ad94e10c2b48e_779.ko\nPass 5: starting run.\nPass 5: run completed in 0usr/0sys/3real ms.\nPass 5: run failed. Try again with another '--vp 00001' option.\n"


(I also had to chmod +s staprun - scary :-))

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 11:15 AM

Post #12 of 23 (299 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Dave Malcolm <dmalcolm [at] redhat> added the comment:

> I tried the patch under Mageia 1 and got the following failure:
Thanks. I'm attaching an updated patch which reworks test_systemtap so that
(a) it turns up the verbosity of stap invocations from "-v" to "-vv"
(b) it tests the "hello world" stap script on a trivial binary ("true") before attempting to invoke sys.executable under stap

What does the error message look like with the extra verbosity?

> (I also had to chmod +s staprun - scary :-))
The chmod invocation sounds like an issue with how Mageia have packaged SystemTap, assuming that you're using a packaged build of systemtap.

----------
Added file: http://bugs.python.org/file25613/cpython-systemtap-2012-05-16-001.patch

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 11:29 AM

Post #13 of 23 (300 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Antoine Pitrou <pitrou [at] free> added the comment:

Still fails. So I tried the script by hand and got:


$ stap - -vv -c true --vp 00001
Created temporary directory "/tmp/stapBvo9zS"
SystemTap translator/driver (version 1.3/0.152 non-git sources)
Copyright (C) 2005-2010 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: AVAHI TR1_UNORDERED_MAP
Session arch: x86_64 release: 2.6.38.8-desktop-10.mga
probe begin { println("hello world") exit () }
Searched "/usr/share/systemtap/tapset/x86_64/*.stp", found 3
Searched "/usr/share/systemtap/tapset/*.stp", found 69
Pass 1: parsed user script and 72 library script(s) using 56252virt/20976res/1840shr kb, in 80usr/0sys/5091real ms.
Pass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) using 56648virt/21504res/1912shr kb, in 0usr/0sys/3real ms.
Pass 3: using cached /home/antoine/.systemtap/cache/15/stap_155c3565481f113c929ad94e10c2b48e_779.c
Pass 4: using cached /home/antoine/.systemtap/cache/15/stap_155c3565481f113c929ad94e10c2b48e_779.ko
Pass 5: starting run.
Running /usr/bin/staprun -v -v -c 'true' /tmp/stapBvo9zS/stap_155c3565481f113c929ad94e10c2b48e_779.ko
staprun:main:268 modpath="/tmp/stapBvo9zS/stap_155c3565481f113c929ad94e10c2b48e_779.ko", modname="stap_155c3565481f113c929ad94e10c2b48e_779"
staprun:init_staprun:206 init_staprun
staprun:insert_module:60 inserting module
staprun:insert_module:79 module options: _stp_bufsize=0
Spawn waitpid result (0x8652802): 255
Pass 5: run completed in 0usr/0sys/3real ms.
Pass 5: run failed. Try again with another '--vp 00001' option.
Running rm -rf /tmp/stapBvo9zS
Spawn waitpid result (0x802): 0


No obvious error message. Who the hell designs such UIs? This seems as stupidly unfriendly as dtrace...

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 11:35 AM

Post #14 of 23 (297 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Frank Ch. Eigler <fche [at] elastic> added the comment:

Hi -

On Wed, May 16, 2012 at 06:29:09PM +0000, Antoine Pitrou wrote:
> [...]
> No obvious error message. Who the hell designs such UIs? This seems
> as stupidly unfriendly as dtrace...

Sorry about that. You're running a near-two-year-old version of
systemtap (1.3); error messages (and of course much functionality) has
improved since.

- FChE

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 11:38 AM

Post #15 of 23 (297 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Antoine Pitrou <pitrou [at] free> added the comment:

> Sorry about that. You're running a near-two-year-old version of
> systemtap (1.3); error messages (and of course much functionality) has
> improved since.

Fair enough. I think the main patch looks go to go. It's clean and
doesn't obscure core parts of the interpreter, which is enough as far as
I'm concerned :-)

As for the devguide patch, I wonder if the devguide's the right place:
do we want to document it for developers of Python, or for everyone?

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 11:46 AM

Post #16 of 23 (301 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Dave Malcolm <dmalcolm [at] redhat> added the comment:

On Wed, 2012-05-16 at 16:41 +0000, Antoine Pitrou wrote:
> Antoine Pitrou <pitrou [at] free> added the comment:
>
> I tried the patch under Mageia 1 and got the following failure:
>
> test_systemtap skipped -- Test systemtap script did not run; stderr was: b"Pass 1: parsed user script and 72 library script(s) using 56252virt/20964res/1828shr kb, in 70usr/0sys/82real ms.\nPass 2: analyzed script: 1 probe(s), 1 function(s), 0 embed(s), 0 global(s) using 56648virt/21492res/1900shr kb, in 10usr/0sys/3real ms.\nPass 3: using cached /home/antoine/.systemtap/cache/15/stap_155c3565481f113c929ad94e10c2b48e_779.c\nPass 4: using cached /home/antoine/.systemtap/cache/15/stap_155c3565481f113c929ad94e10c2b48e_779.ko\nPass 5: starting run.\nPass 5: run completed in 0usr/0sys/3real ms.\nPass 5: run failed. Try again with another '--vp 00001' option.\n"

Thanks. I'm attaching an updated patch which reworks test_systemtap so
that
(a) it turns up the verbosity of stap invocations from "-v" to "-vv"
(b) it tests the "hello world" stap script on a trivial binary
("true") before attempting to invoke sys.executable under stap

What does the error message look like with the extra verbosity?

The chmod invocation sounds like an issue with how Mageia have packaged
SystemTap, assuming that you're using a packaged build of systemtap.

----------
Added file: http://bugs.python.org/file25615/cpython-systemtap-2012-05-16-001.patch

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
Attachments: cpython-systemtap-2012-05-16-001.patch (15.6 KB)


report at bugs

May 16, 2012, 11:48 AM

Post #17 of 23 (297 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Dave Malcolm <dmalcolm [at] redhat> added the comment:

(Sorry about msg160913; looks like my initial email response took about an hour to get through, and I'd subsequently commented using the webui form)

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 11:56 AM

Post #18 of 23 (295 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Changes by Dave Malcolm <dmalcolm [at] redhat>:


----------
Removed message: http://bugs.python.org/msg160913

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 11:57 AM

Post #19 of 23 (298 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Changes by Dave Malcolm <dmalcolm [at] redhat>:


----------
Removed message: http://bugs.python.org/msg160914

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 16, 2012, 11:59 AM

Post #20 of 23 (295 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Changes by Dave Malcolm <dmalcolm [at] redhat>:


Removed file: http://bugs.python.org/file25615/cpython-systemtap-2012-05-16-001.patch

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 17, 2012, 1:13 PM

Post #21 of 23 (295 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Dave Malcolm <dmalcolm [at] redhat> added the comment:

Thanks. I too am wondering where the documentation should go. We currently have several locations for documentation:
(1) the man page
(2) the "Doc" subdirectory aka docs.python.org
(3) various text files in the source tree, such as Misc/SpecialBuilds.txt
(4) the devguide
(5) www.python.org, and other web sites

This feature is about instrumentation of CPython, which is of use to several audiences, such as:
(a) people working on CPython's internals
(b) Python developers seeking to understand performance issues
(c) sysadmins trying to tweak the performance of, say, a deployed web app

As I understand it, the devguide is targetting (a), whereas the Doc subdirectory of the cpython sources is targetting (b) when they're writing the code, but not necessarily when tuning it, and (c) doesn't seem to get covered.

So perhaps there should be a new top-level section of documentation within the main Python Doc directory covering instrumentation and performance? (e.g. "instrumentation" or "debugging"). If so, these docs could be an entry within that section. Though I don't want to block this feature on writing up a full guide to debugging/deploying Python :)

Less ambitiously, we could just add it to the "howto" section (which appears to be something of a dumping ground for docs that didn't fit neatly into the other categories). Would that be acceptable in lieu of a better location?

Or is this something for the python-dev mailing list?
Cheers!

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 17, 2012, 1:17 PM

Post #22 of 23 (297 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Antoine Pitrou <pitrou [at] free> added the comment:

I think it could go into "python setup and usage" (http://docs.python.org/dev/using/index.html), but that seems target at first-time users; or perhaps a HOWTO (http://docs.python.org/dev/howto/index.html), but it might make it less visible. Or a "debug and instrumentation" section indeed (we could also put the python-gdb doc there).

Perhaps you could ask python-dev indeed.

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com


report at bugs

May 17, 2012, 9:49 PM

Post #23 of 23 (274 views)
Permalink
[issue14776] Add SystemTap static markers [In reply to]

Éric Araujo <merwok [at] netwok> added the comment:

> We currently have several locations for documentation:
Don’t forget the wiki <wink>. It is much less curated than the other docs.

> Though I don't want to block this feature on writing up a full guide to debugging
I started work on a debugging howto: #12913. Maybe your patch could create a file in Doc/howto/debugging.rst to be filled later by my patch?

> Less ambitiously, we could just add it to the "howto" section (which appears to be something of
> a dumping ground for docs that didn't fit neatly into the other categories).
On the contrary, the howtos are user-focused documents that forsake the dry reference style of the main docs and provide much needed examples and walkthroughs on some topics.

----------

_______________________________________
Python tracker <report [at] bugs>
<http://bugs.python.org/issue14776>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com

Python bugs RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.